Django3.2邊學邊記—Adimn站點管理

準備工作

創建管理員的用戶名和密碼: 

python manage.py createsuperuser

  根據提示創建用戶名 密碼

在admin.py中註冊模型類

from django.contrib import admin
from models import Test

class TestAdmin(admin.ModleAdmin):
    pass

admin.site.register(Test,TestAdmin)

瀏覽器端登錄頁面:類似以下後綴

//127.0.0.1:8000/admin/

  


管理頁面顯示

創建模型管理類來管理某個模型在後台顯示的頁面形式

ModelAdmin類可以控制不同模型在Admin界面中的展示方式,主要包括在列表頁的展示方式、添加修改頁的展示方式

上文中展示了TestAdmin類的一種註冊方法,還有一種方法,就是使用裝飾器註冊,如下:

@admin.register(Test)
class TestAdmin(admin.ModelAdmin):
    pass

頁大小

每頁中顯示多少條數據,默認為每頁顯示100條數據,設置為20

class TestAdmin(admin.ModelAdmin):
    list_per_page = 20

操作選項的位置

  由action_on_bottom 和action_on_top兩屬性來控制 默認顯示在頂部,默認值分別為:False 和 True,改為只顯示在底部:

class TestAdmin(admin.ModelAdmin):
    list_per_page = 20
    actions_on_bottom = True
    actions_on_top = False

  

顯示哪些列 

用   list_display=[模型字段1,模型字段2,模型方法1,...] 控制顯示的列,Django 會嘗試按照這個順序解釋 list_display 的每個元素:

  • 一個模型的字段。
  • 一個可調用對象。
  • 一個代表 ModelAdmin 屬性的字符串。
  • 一個代表模型屬性的字符串。

用模型屬性顯示 模型的id title pub_date 三個屬性

class TestAdmin(admin.ModelAdmin):
    ...
    list_display = ['id','title','pub_date']

  或者模型方法,要求方法有返回值,如下在模型類中定義一個方法 

class TestInfo(models.Model):
    ...
    def atitle(self):
        return self.title

按以上方法顯示的列是不能排序的,如果讓這個方法顯示的列也能排序,就給atitle方法的.admin_order_field屬性,指定排序依據的模型屬性,如下:

# from django.db import models
# from django.contrib import admin
class TestInfo(models.Model): ... def atitle(self): return self.title atitle.admin_order_field = 'title' #注意有引號

列標題

默認為方法的名稱,

  可以通過.short_description屬性設置

class TestInfo(models.Model):
    ...
    atitle.short_description='標題'

  如果是更改模型字段顯示的列標題,可以在定義模型字段時,設置verbose_name的值 ,或者封裝成方法,再對方法使用上面那個屬性,模型字段不能直接使用那個屬性。  

class Test(models.Model):
    title = models.CharField(max_length=20,verbose_name='標題')

如果一個字段的值是 None,一個空字符串,或者一個沒有元素的可迭代字段,Django 將顯示 - (破折號)。

  你可以用empty_value_display 屬性更改

from django.contrib import admin
  ...
  atitle.empty_value_display = '(None)'

  或者管理類中設置屬性

class PersonAdmin(admin.ModelAdmin):
    empty_value_display = 'unknown'

以上通過指定方法屬性來控制顯示是新老版本通用的,在Django3.2可以通過給裝飾器傳參來解決

from django.db import models
from django.contrib import admin

class Test(models.Model):
    ....
    
    """
    empty_value:屬性值為空時 處理
    description:顯示名
    ordering:排序依據
    boolean:返回值為bool型
    其中:
    empty_value 和 boolean 只能設置一個(互斥)
    """
    @admin.display(empty_value='空', description='父級地名', ordering='id',boolean=True)
    def title2(self):
        return self.title

過濾器

用 list_filter 來激活管理更改列表頁面右側側欄的過濾器,如下截圖所示:

../../../_images/list_filter.png  

 list_filter 應是一個元素的列表或元組,會將對應字段的值列出來,一般用於快速過濾有重複值的字段

 

class TestAdmin(admin.ModelAdmin):
    list_filter = ['is_delete']

  

搜索框

用 search_fields,在管理啟用搜索框。 

class TestAdmin(admin.ModelAdmin):
    search_fields = ['id','name']

在搜索框中進行搜索時,Django 會將搜索查詢拆分成多個詞,並返回所有包含這些詞的對象,不區分大小寫(即 icontains 查找:不區分大小寫的包含匹配),其中每個詞必須在 search_fields 中至少有一個。例如,如果 search_fields 設置為 ['first_name', 'last_name'],用戶搜索 john lennon',Django 會做相當於這個 SQL WHERE 子句。

WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')

搜索查詢可以包含帶空格的引號短語。我的理解就是分組整體匹配(Django3.2新增),例如,如果用戶搜索 "john winston" 或 'john winston',Django 會做相當於這個 SQL 的 WHERE 子句:

WHERE (first_name ILIKE '%john winston%' OR last_name ILIKE '%john winston%')

如果你不想使用 icontains 查找方式,你可以使用 ModelAdmin.get_search_results() 來提供額外的或替代的搜索行為。 

 

Tags: