Django的admin相關
自定義admin展示的內容
根據之前已經創建好了的models
from django.db import models class Person(models.Model): name = models.CharField(max_length=64, unique=True) age = models.IntegerField() birthday = models.DateField() gender_choices = ((u'male', '男'), (u'female', '女')) gender = models.CharField(max_length=6, choices=gender_choices, default='male') blog_url = models.URLField(verbose_name="網址") email = models.EmailField(help_text="寫入一個類似123@qq.com的格式") host = models.GenericIPAddressField(null=True, blank=True) def __str__(self): return self.name class Meta: verbose_name_plural = '個人信息'
配置admin.py,自定義要展示的內容
- 第一種:通過繼承ModelAdmin類來定義admin里的內容。ModelAdmin類是admin接口中model的表現形式
from django.contrib import admin
from .models import Person
class Person_Display(admin.ModelAdmin):
list_display = ("name", "birthday", "gender", "blog_url", "email", "host") # 要顯示的字段
admin.site.register(Person, Person_Display)
- 第二種:也可以使用@admin.register裝飾器注冊ModelAdmin
from django.contrib import admin
from .models import Person
@admin.register(Person)
class Person_Display(admin.ModelAdmin):
list_display = ("name", "birthday", "gender", "blog_url", "email", "host")
查看admin:

list_display 控制admin的更改列表頁面上顯示的字段。如果沒有設置list_display,只顯示一列,顯示__str__()的對象。
特殊情況:
- 如果字段是 ForeignKey,將顯示__str__的對象
- 不支持 ManyToManyField 類型
- 可以調用models里面類的方法。將默認HTML轉義輸出,要使html格式生效,需要使用format_html()。 通過short_description 可以給models類的方法加上名字。
例如: # models.py
from django.db import models from django.utils.html import format_html class Person(models.Model): ......... gender_choices = (('male', '男'), ('female', '女')) gender = models.CharField(max_length=6, choices=gender_choices, default='male') def colored_gender(self): if self.gender == 'male': return format_html('<span style="color: green;">男生</span>') else: return format_html('<span style="color: red;">女生</span>')
colored_gender.short_description = "性別" #可以通過添加short_description屬性來自定義列的標題
# admin.py
from django.contrib import admin from .models import Person @admin.register(Person) class Person_Display(admin.ModelAdmin): list_display = ("name", "birthday", "blog_url", "email", "host", "colored_gender",)

list_editable 允許在列表頁面上對字段進行編輯
list_filter 激活admin列表頁面右側邊欄中的過濾器。
list_per_page 一頁顯示的項目數,默認為100
ordering 排序,字段前面加一個- ,表示倒序
search_fields 啟用列表頁面上的搜索框。如果有外鍵或者多對多關聯,可以通過foreignkey__fieldname搜索。
例如 student 列表里,search_fields = ('school__name',)??梢钥梢酝ㄟ^學校名字搜索學生條目。
示例:
from django.contrib import admin from .models import Person @admin.register(Person) class Person_Display(admin.ModelAdmin): list_display = ( "name", "birthday", "blog_url", "email", "host", "colored_gender",) #展示的字段 list_editable = ('blog_url', ) # 可以在列表頁面編輯 list_filter = ("name", "birthday") #右邊導航欄的過濾器 list_per_page = 3 #一頁顯示的條目 ordering = ["-birthday", ] #按生日倒序 search_fields = ["name", ] # 搜索欄

修改一條對象里面的顯示內容:
filter_horizontal(多對多) 默認在admin某一個對象管理里面,ManyToMany顯示為一個多選框。
增加此選項,允許在選項內進行搜索。未選中和選定的選項并排顯示在兩個框中。
例如 在student 設置filter_horizontal = ( 'teacher',)
------------------》
filter_vertical 與filter_horizontal相同,不過是豎排。
raw_id_fields(外鍵) 默認ForeignKey字段是一個選擇框,為了減小開銷,可以將其改為選擇一個窗口小部件選擇。
---------》
彈出小窗
更多參考: https://docs.djangoproject.com/en/2.1/ref/contrib/admin/
添加Admin Action
如果要同時對許多對象進行相同的更改,那么可以定制admin action,批量操作列表里的對象。

例如,將學生里未注冊的全部改為已注冊。
# models.py
from django.db import models from django.utils.html import format_html class Student(models.Model): sname = models.CharField(max_length=64) age = models.IntegerField() statu_choices = (('registered', u'已注冊'), ('unregister', u'未注冊'), ) status = models.CharField(choices=statu_choices, max_length=32, default='unregister') def __str__(self): return self.sname def status_color(self): if self.status == 'registered': f = format_html( '<span style="padding:2px;background-color:green;">已注冊</span>') else: f = format_html('<span style="padding:2px;background-color:red;">未注冊</span>') return f status_color.short_description = 'status'
# admin.py
def make_register(modelAdmin, request, queryset): #action函數
queryset.update(status='registered') # 修改字段
make_register.short_description = 'Make register' # 動作描述
@admin.register(Student)
class Student_More_Info(admin.ModelAdmin):
actions = [make_register] #添加動作
1, 寫動作函數。我們需要編寫一個在從admin觸發操作時調用的函數。 Action函數只是帶有三個參數的常規函數??:
當前ModelAdmin,一個HttpRequest表示當前請求,QuerySet包含用戶選擇的一組對象。
2,添加動作 action=[]


action高級寫法:將action作為ModelAdmin的方法
因為action和Person對象是緊密耦合的,所以可以將action放到Person_display對象中:
from django.contrib import admin from .models import Person @admin.register(Person) class Person_Display(admin.ModelAdmin): actions = ['change_gender', ] # action列表里面是字符串,而不是函數 def change_gender(self, request, queryset): # modeladmin參數改為self queryset.update(gender='female') change_gender.short_description = "Mark selected person as female ^_^~"

浙公網安備 33010602011771號