Django實現自定義template頁面並在admin site的app模塊中加入自定義跳轉鏈接(一)


Django的admin site結合ORM提供了非常強大的數據庫操作功能,少量代碼即可快速實現對數據庫table數據進行展示、修改、保存的可視化頁面和功能。

Django admin頁面默認的展示是分多個app模塊,每個app模塊下面定義的數據庫model會以表名作為超鏈接的形式展現出來,比如一個只有Django服務初始化時默認只有一個Auth模塊,其下有Users與Groups兩張表,添加用戶自定義的Feedback模塊及Feedback表的model之后,admin site頁面會如下所示:

 

 有時候,我們需要為FEEDBACK app定義一些自定義的頁面,提供一些admin site+ORM無法直接提供的功能,比如根據Feedbacks表中記錄,匯總展示每天不同類型反饋的整體處理情況,然后需要在admin site頁面中對應的app 模塊下加入跳轉鏈接。下面分兩步記錄一下實現步驟。

1,自定義Django template 頁面

編寫一個簡單的使用Django template語言的feedback_stats.html文件,文件必須位於Django加載html文件的默認路徑之下,這里選擇放在feedback/templates/下,下面這個html文件會根據傳入的theads和trows參數生成一個數據展示表格:

{% extends "admin/base_site.html" %}
{% load static %}


{% block content %}
    <div>
        <label><h2>反饋統計</h2> </label>
        </br>
        <table class="table" table-layout="fixed" width="600px">
            <thead>
                <tr>
                    {% for thead in theads %}
                        <th> {{ thead }} </th>
                    {% endfor %}
                </tr>
            </thead>
            <tbody>
                {% for tr in trows %}
                    <tr>
                        {% for td in tr %}
                            <td> {{ td | safe }} </td>
                        {% endfor %}
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
{% endblock %}

在views.py文件中,通過 django.shortcuts.render函數將該包含template語法的html文件渲染成純html web頁面,並將計算好的數據記錄以鍵值參數的形式傳給render函數,feedback/views.py文件內容如下:

#!/usr/bin/env python
# coding=utf-8
from django.shortcuts import render
import MySQLdb


conn = MySQLdb.connect(
    host='localhost',
    port=3306,
    user='root',
    db='test'
    )

dtype = {
    0: u'未知分類',
    1: u'無法播放',
    2: u'違規舉報',
    3: u'質量問題',
}

dstatus = {
    0: u'待確認',
    1: u'待解決',
    2: u'已解決',
    3: u'無需解決',
}

def feedback_stats(request):
    cursor = conn.cursor()
    cursor.execute('select defect_type, status, count(1) as cnt, left(ctime, 10) from feedback group by defect_type, status, left(ctime, 10) order by ctime desc;')
    records = [(dtype[x[0]], dstatus[x[1]], x[2], x[3]) for x in cursor.fetchall()]
    theads = ['反饋類型', '當前狀態', '數量', '時間']
    return render(request, 'feedback_stats.html', {"theads": theads, "trows": records})
feedback/views.py

feedback/urls.py文件內容如下:

#!/usr/bin/env python
# coding=utf-8
from django.conf.urls import url 
import views

urlpatterns = [ 
    url(r'^feedback_stats/$', views.feedback_stats),
    url(r'^admin/feedback_stats/$', views.feedback_stats),
    ] 
feedback/urls.py

數據庫feedback表中存在以下數據:

| id | video_id | udid     | defect_type | message  | ctime               | total | status |
+----+----------+----------+-------------+----------+---------------------+-------+--------+
|  1 |        1 | udid1234 |           3 | testtext | 2017-11-21 02:38:11 |    55 |      1 |
|  2 |        1 | udid1234 |           3 | testtext | 2017-11-21 02:53:13 |    55 |      1 |
|  3 |        1 | udid1234 |           0 | testtext | 2017-11-21 02:53:18 |    55 |      2 |
|  4 |        1 | udid1234 |           0 | testtext | 2017-11-21 02:53:23 |    55 |      2 |
|  5 |       11 | udid1234 |           0 | testtext | 2017-11-21 02:55:30 |    55 |      2 |
|  6 |       19 | udid1234 |           0 | testtext | 2017-11-21 02:55:35 |    55 |      0 |
|  7 |       19 | udid1234 |           0 | testtext | 2017-11-21 03:06:43 |    55 |      0 |
|  8 |       19 | udid1234 |           0 | testtext | 2017-11-28 00:09:45 |    55 |      0 |
|  9 |       11 | udid1234 |           0 | testtext | 2017-11-28 00:09:58 |    55 |      3 |
| 10 |      101 | udid1234 |           1 | testtext | 2017-11-28 00:10:04 |     5 |      3 |
| 11 |      121 | udid1234 |           1 | testtext | 2017-11-28 00:10:14 |    75 |      3 |
| 12 |       77 | udid1234 |           1 | testtext | 2017-11-28 00:10:24 |     7 |      3 |
| 13 |       27 | udid1234 |           2 | testtext | 2017-11-28 00:10:33 |    91 |      3 |
| 14 |       27 | udid1234 |           2 | testtext | 2017-11-28 00:13:11 |    91 |      0 |
| 15 |       32 | udid1234 |           2 | testtext | 2017-11-28 00:13:18 |    91 |      0 |
+----+----------+----------+-------------+----------+---------------------+-------+--------+
feedback表記錄

訪問http://127.0.0.1:8000/feedback/feedback_stats/ 可以查看到區分反饋類型的問題狀態統計信息:

 

 到這里,我們已經實現了自定義template統計頁面的功能,並且可以通過/feedback/feedback_stats/或者/admin/feedback/feedback_stats/的路徑進行訪問,然而這個鏈接並不能在admin site的頁面上顯示出來,admin頁面下的FEEDBACK app模塊下,還是只有一個跳轉到feedback表admin頁面的超鏈接,絲毫找不到跳轉到feedback_stats頁面的超鏈接,看起來直接在admin/feedback/路徑后手動添加一個子路徑,Django並不會智能的在admin頁面自動添加相應的跳轉超鏈接。如果這樣每個自定義的頁面連接都無法在admin頁面展示一個相應的超鏈接,每次使用需要手動輸入整個路徑的話,無疑是非常繁瑣的,那Django能不能做到在admin頁面下添加用戶自定義頁面的超鏈接呢?答案當然是可以的,參見Django實現自定義template頁面並在admin site的app模塊中加入自定義跳轉鏈接(二)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM