django-admin開發經驗總結

概述

搞了好久的django開發,心理略有所得,在這裏寫一下自己的所得。
django-admin是一個很強大的軟件,對於我這種沒有前端配合的人來說,很好很合適。這裏篇文章主要是總結一些自己使用到的小技巧,方便之後自己回憶。這裏主要寫的都是思路,如果有想要實現,則需要查看更多的相關資料來實現。
主要內容:

  • 數據庫監控與優化
  • 界面美化
  • django-admin自定義頁面和功能

數據庫連接與優化

django連接數據庫通過ORM的方式連接,很多時候我們需要了解自己頁面在實現不同功能的時候與數據庫交互了多少次,並以此優化響應速度。具體的優化手段請百度。。。

安裝控件debug_toolbar

pip3 install django_debug_toolbar
添加調試工具app·

#settings.py
INSTALLED_APPS = [
    ...
    # 數據庫監控服務
    'debug_toolbar',
    ...

配置

在settings裏面增加數據監控中間件

MIDDLEWARE = [
    # 數據庫監控中間件,一定要放在第一行
    'debug_toolbar.middleware.DebugToolbarMiddleware',

添加調試工具的ip

#settings.py
#經測試,好像只有一個ip有效
INTERNAL_IPS = [
    ...
]

其他配置:
包括頁面上顯示的組件類型等,請參考官方文檔。(我個人覺得默認的就行)
增加訪問url

#urls.py
urlpatterns = [
    ...
    path('__debug__', include(debug_toolbar.urls)),
	...
]

完成之後大概這個效果:
在這裏插入圖片描述
注意:如果使用了第三方的頁面顯示插件比如simpleui或xadmin等,會影響使用。儘量使django爲原生的html。

基於simpleui的界面美化

simpleui是一個很好看的django-admin殼,可以讓djangoadmin顯得更好看。(如果對頁面需求更甚,可以使用simpleuipro,前後端分離,更適合修改)
simpleui支持自定義菜單,可以很方便的開發一些獨立頁面放在前面。另外,頁面是用vue寫的,但是並沒有獨立的vue類被創建,這一點就很尷尬,看起來整個有些不倫不類。當然不影響使用,只是看元am會比較頭疼。
具體內容請查看:https://simpleui.88cto.com/docs/simpleui/
這裏我貼一些圖片:
在這裏插入圖片描述
在這裏插入圖片描述

在菜單欄增加按鈕

from django.utils.html import format_htmldjango的這個方法可以將text渲染爲html發送到前端。
只需要增加一個方法,然後返回前端的代碼就能夠實現,
示例如下:

在admin裏面增加一個方法
    def change_logging(self, instance: ReportRecord, **kwargs):
        return format_html("<a style='color:blue;' >查看詳情</a>")

就會變成一個按鈕,當然如果你想要更復雜的,也是沒問題的,比如返回js代碼,返回一個框架頁面等等等…
注意,如果返回的代碼裏面有{,那麼記得要用兩個括號替代一個括號,因爲兩個括號纔會被渲染爲一個括號。

通過django的模板渲染vue的頁面

這個就比較偏門了,但是感覺很好用。
verbatim:的意思是(完全)按照字面,原樣不動的意思的,Django不會渲染verbatim標籤包裹的內容。

{% verbatim %}{{這裏面的內容是不會被渲染的}}{% endverbatim %}

根據不同角色(或參數)動態顯示admin頁面的內容

這裏主要是通過重寫admin的一些get方法實現的,

#在modeladmin裏面
    def get_queryset(self, request):
        """
        如果爲超級管理員則顯示所有數據,否則只顯示對應用戶數據
        
        """
        if not request.user.is_superuser:
            return Project.objects.filter(account__user=request.user)
        else:
            return Project.objects.all()


一些其他常用的可以重構的方法,具體內容請看文檔(不常用的也請查看文檔):

get_actions:可以根據用戶權限顯示該頁面擁有的方法。(注意區分get_action)
get_changelist:
get_changelist_form:大概類似於get_form?
get_changelist_formset:
get_changelist_instance:
get_deleted_objects:
get_empty_value_display:修改空字段顯示結果
get_exclude:替代exclude的值
get_fields:替代fields
get_form:返回用戶修改或增加數據的form,這裏基本上可以通過定製form的方式定製整個頁面。
get_formsets_with_inlines:
get_inline_formsets:
get_inline_instances:
get_list_display:
get_list_display_links:
get_list_filter:
get_list_select_related:
get_model_perms:
get_object:
get_ordering:
get_paginator:
get_prepopulated_fields:
get_preserved_filters:
get_queryset:返回list列表的顯示結果,一般我用來區分超級用戶和普通用戶能夠看到的數據結果。
get_readonly_fields:
get_search_fields:相當於修改搜索器的輸入參數
get_search_results:相當於將搜索器搜索到的結果再過濾一遍
get_urls:可修改默認的url訪問地址,或增加幾個其他的訪問地址,這個很有用。
get_view_on_site_url:可重寫view頁面

如果需要重寫,請查看django源碼裏面更詳細的介紹,我這裏只是拋磚引玉,更多的內容請自行補充。

生成自定義顯示的字段

    #在list_display裏面可以增加該字段以顯示
    def exhibition_name(self, obj: FkXls):
        return Project.objects.get(fk_exhibition_id=obj.my_log.fk_exhibition_id).my_exhibition_name

    exhibition_name.short_description = "項目"# 在頁面上表頭名字
    exhibition_name.admin_order_field = "my_log__fk_exhibition_id"#排序使用的字段

自定義form表單

這裏就是對admin類重寫表單,可以通過修改表單的一些小部件之類的,實現頁面的一些其他方法或更好看。
這裏舉個例子,我通過自定義form表單實現djangoadmin頁面的vue操作(寫的很醜,見諒)。
以自定義的date選擇器爲例

重寫小部件模板

使用的element頁面框架。

{# 修改日期選擇器文件:data.html#}
<el-date-picker
        v-model="{{ widget.name }}"
{#        設置日期格式#}
        value-format="yyyy-MM-dd"
        type="date"
        placeholder="選擇日期">
</el-date-picker>
{# 注意,這裏沒有引用attrs.html,這個你們可以看着辦,說實話引用了也沒啥用,vue渲染不上去,所以小部件暫時我沒辦法做成通用的,當然肯定有牛逼的人能夠搞定,我又不寫前端就這樣吧#}

創建自己的dateInput

from django import forms

class ChiseDateInput(forms.DateInput):
    template_name = "widgets/date.html"

然後引用的時候就可以這樣引用了:

class StartPcForm(forms.Form):
    #注意widget
    start_time = forms.DateField(widget=ChiseDateInput, label="開始日期")
    end_time = forms.DateField(widget=ChiseDateInput, label="結束日期")

form表單還有很多可以操作的地方,比如數據驗證等等,比drf感覺要好用很多。效率也更高一些

一些其他建議

這一部分是不太好用代碼進行講解的。
建議所有的model的manager重寫,所有的model繼承於自己的BaseModel,這樣就能夠實現更方便的控制,比如僞刪除,等等。
另外,多看github,多看django源碼,獲益良多。
想到自己就要失業了,還在這裏說這麼多。感覺還是很苦笑。
本來還有很多東西,之後有心情在寫吧。
另,如果各位讀者,寫的系統併發量較大,記得用pypy或者mypy優化系統的併發量,免得被別人詬病python效率太低。也爲各位pythoner爭口氣吧。

發佈了50 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章