Django admin 模型选项(ModelAdmin) 【详细】

6 篇文章 1 订阅

👉Django admin 模型选项(ModelAdmin) 【简要】查看


1. actions

  • 给列表页面上提供额外操作功能

定义一个模型DataBaseA,其中包含一个字符字段A,A有两用取值 yn

# models.py
class DataBaseA(models.Model):
    A = models.CharField(max_length=50, choices=[('y', 'yes'), ('n', 'no')])

    def __str__(self):
        return self.A

为amdin页面添加一个批量操作 “将选择的内容改为y”

# admin.py
from django.contrib import admin
from .models import DataBaseA

def make_data(modeladmin, request, queryset):
    queryset.update(A='y')

make_data.short_description = "将选择的内容改为y"

class DataBaseAdminA(admin.ModelAdmin):
    actions = [make_data]

admin.site.register(DataBaseA, DataBaseAdminA)

运行后可以看到自定义的批量操作

2. actions_on_top 和 actions_on_bottom

  • 控制操作栏在页面上的显示位置

默认actions_on_top = True; actions_on_bottom = False,其操作栏位于数据库列表上方

actions_on_top = False
actions_on_bottom = True

编写代码后展示如下

如果只设置actions_on_bottom = True,那么操作栏将在列表上方和下方同时显示;同样,你也可以是它在上方或下方都不显示。

3. actions_selection_counter

  • 控制选择计数器是否显示在操作下拉列表旁边

默认情况下,操作了旁边显示列表总数与已选择的数目,如果将此属性设置为False 将不显示

4. date_hierarchy

  • 设置为模型中的DateFieldDateTimeField字段基于日期的分层筛选导航

DataBaseA 添加一个日期字段 B,设置此属性的值为字段B,将为当前模型建立一个基于此日期字段的筛选导航

list_display = ('A', 'B')
date_hierarchy = 'B'

5.empty_value_display

  • 设置记录字段为空(None,空字符串等)的默认显示值

添加一个字符字段C并设置其允许为空,如果记录该字段内容为空是设置该属性进行显示一个其他值,默认为-

empty_value_display = "空"

6. exclude

  • 表单中不展示的字段
exclude = ('B',)

此属性设置后在添加数据页面不显示其设置的字段,不显示的字段将被编辑为空。

7. fields

  • 在“添加”和“编辑”页面上的表单中进行简单的布局更改

fields 决定对表进行编辑时展示哪些字段

fields = ('A', 'C')


同时也可设置字段处于同一行

fields = (('A', 'B'), 'C')

8. fieldsets

  • 控制“添加”和“编辑”页面的布局,fieldsets是一个二元组列表,其中每个二元组代表管理表单页面上的<fieldset>, 这两个元组的格式为(name,field_options),其中name是代表字段集标题的字符串,field_options是有关字段集的信息词典,包括要在其中显示的字段的列表

field_options字典可以具有以下键

fields要在此字段集中显示的字段名称的元组。此键是必需的
classes包含要应用于该字段集的额外CSS类的列表或元组
description一串可选的额外文本,将显示在每个字段集顶部,字段集标题下;
默认样式collapse和wide。
collapse样式的字段集将折叠,并替换为一个小的“单击以展开”链接。
wide样式的字段集将获得额外的水平空间。
fieldsets = (('内容1', {'fields': ('A', 'B'),
                      'classes': ('wide',)}),
             ('内容2', {'fields': ('C',),
                      'classes': ('collapse',),
                      'description': '这是额外的描述信息'}))

9.filter_horizontal 和 filter_vertical

  • 水平(垂直)显示过滤器, 用于多对多模型(ManyToMany)

为模型DataBaseA添加一个多对对字段D,关联到新创建模型DataBaseBDataBaseB内含有有个字符字段X

# models.py
from django.db import models

class DataBaseA(models.Model):
    A = models.CharField(max_length=50, choices=[('y', 'yes'), ('n', 'no')])
    B = models.DateField(blank=True, null=True)
    C = models.CharField(max_length=50, blank=True, null=True)
    D = models.ManyToManyField('DataBaseB', blank=True)
    
    def __str__(self):
        return self.A

class DataBaseB(models.Model):
    X = models.CharField(max_length=50)

    def __str__(self):
        return self.X

默认视图

设置此属性为多对多字段,为该字段添加一个水平过滤器

filter_horizontal = ('D',)


当设置 filter_vertical = ('D',) 后显示为垂直过滤器

10. form

  • 用于定制用户请求时候表单验证

给字段C增加一个验证,让其只能接收四位数字

from django.contrib import admin
from .models import DataBaseA
from django import forms

def validate(value): # 验证数据
    try:
        v = int(value)
    except:
        raise forms.ValidationError(u'输入四位数字')
    if len(value) != 4:
        raise forms.ValidationError(u'输入四位数字')

class MyForm(forms.ModelForm):
    code = forms.CharField(validators=[validate], widget=forms.TextInput(attrs={'placeholder': u'输入四位数字填充字段C'}))

    class Meta: # 不展示字段C
        exclude = ['C']

class DataBaseAdminA(admin.ModelAdmin):
    list_display = ('A', 'C')
    form = MyForm

    def save_model(self, request, obj, form, change): # 自定义save_model()给字段C填充数据
        code = request.POST.get('code')
        obj.C = code
        obj.save()
        
admin.site.register(DataBaseA, DataBaseAdminA)

当字段C接收非四位数子提示警告

11.formfield_overrides

  • 提供了一种快捷方式来覆盖某些在管理员中使用的“Field”选项

将默认TextField字段的文本框改小一点

from django.contrib import admin
from .models import DataBaseA
from django.db import models
from django.forms import Textarea

class DataBaseAdminA(admin.ModelAdmin):
    list_display = ('A', 'C', 'E')
    formfield_overrides = {
        models.TextField: {'widget': Textarea(attrs={'rows': 2, 'cols': 25})},
    }

admin.site.register(DataBaseA, DataBaseAdminA)

默认:

改变后:

官方给出的实例是这个样子的

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

# Import our custom widget and our model from where they're defined
from myapp.models import MyModel
from myapp.widgets import RichTextEditorWidget

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': RichTextEditorWidget},
    }

12. inlines

  • 模型内联

DataBaseA 和 DataBaseB 是一对多关系,在模型DataBaseA中内联DataBaseB,将其内容添加到DataBaseA进行动态编辑

# models.py
from django.db import models

class DataBaseA(models.Model):
   A = models.CharField(max_length=100)

   def __str__(self):
      return self.A

class DataBaseB(models.Model):
   X = models.ForeignKey(DataBaseA, on_delete=models.CASCADE)
   Y = models.CharField(max_length=100)

   def __str__(self):
      return self.Y
# admin.py
class DataBaseAdminB(admin.TabularInline):
    model = DataBaseB
    extra = 1 # 默认为3

class DataBaseAdminA(admin.ModelAdmin):
    inlines = [DataBaseAdminB]

admin.site.register(DataBaseA, DataBaseAdminA)
admin.site.register(DataBaseB)


Django提供了InlineModelAdmin的两个子类,它们是: TabularInlineStackedInline;他们略有区别

TabularInline:

StackedInline:

13. list_display

  • 控制列表页面上显示哪些字段

可以使用四种类型的值list_display:

  • 模型字段的名称
list_display = ('A', 'B', 'C')

  • 接受一个参数(模型实例)的可调用对象
def upper_case_name(obj):
    return ("%s : %s" % (obj.A, obj.B)).upper()

upper_case_name.short_description = 'A 和 B'

class DataBaseAdminA(admin.ModelAdmin):
    list_display = (upper_case_name,)

  • 一个字符串,表示ModelAdmin接受一个参数(模型实例)的方法
class DataBaseAdminA(admin.ModelAdmin):
    list_display = ('upper_case_name',)

    def upper_case_name(self, obj):
        return ("%s : %s" % (obj.A, obj.B)).upper()

    upper_case_name.short_description = 'A 和 B'

  • 代表模型属性或方法的字符串(不带任何必需的参数)
# models.py
from django.db import models

class DataBaseA(models.Model):
   D = models.DateField(blank=True, null=True)

   def decade_born_in(self):
      return self.D.strftime('%Y')[:4]

   decade_born_in.short_description = '年'   

# admin.py
from django.contrib import admin
from .models import DataBaseA

class DataBaseAdminA(admin.ModelAdmin):
    list_display = ('decade_born_in', 'D')
    
admin.site.register(DataBaseA, DataBaseAdminA)


详细帮助查看原文档跳转

14.list_display_links

  • 控制是否将list_display中的哪些字段链接到编辑页面
list_display = ('A', 'B', 'C')
list_display_links = ('C',)

15. list_editable

  • 设置模型的字段允许在列表页面上进行编辑
list_display = ('A', 'B', 'C')
list_editable = ('B',)

16. list_filter

  • 激活过滤器, 显示列表页面右侧栏中的过滤器
list_display = ('A', 'B', 'C')
list_filter = ('B', 'C')

17. list_max_show_all

  • 控制列表页面上的“显示全部”可以显示多少条数据(默认200)

设置list_per_page 后 设置list_max_show_all将不起效果,可能数据量少的原因,此属性有待探究

18. list_per_page

  • 控制每个分页的列表页面上显示多少条数据(默认100)
list_per_page = 5

19. list_select_related

  • select_related()在列表页面上检索对象列表时使用

设置list_select_related为告诉Django select_related()在列表页面上检索对象列表时使用。这样可以为您节省大量数据库查询

该值应该是布尔值,列表或元组。默认值为False。
当值为True时,将始终调用select_related()。当值设置为False时,Django将查看list_display并调用select_related()(如果存在任何ForeignKey)
如果需要更精细的控制,请使用元组(或列表)作为list_select_related的值。空元组将完全阻止Django调用select_related()。任何其他元组将直接传递给select_related作为参数

20. ordering

  • 设置默认排序字段
ordering = ['B']

21. paginator

  • 用于分页的分页器类

暂无查到关于admin分页器的内容
官方介绍:

默认情况下,使用django.core.paginator.Paginator。如果自定义paginator类与django.core.paginator.Paginator没有相同的构造函数接口,则还需要提供ModelAdmin.get_paginator() 的实现。

22. prepopulated_fields

  • 将字段名称映射到应预填充的字段

添加页面,当在某字段填入值后,自动会将值填充到指定字段

prepopulated_fields = {"A": ("B", "C",)}

当对字段B与C输入内容时,A字段将会自动填充B或C的内容,多个字段会使用-来分割
在这里插入图片描述

23. preserve_filters

  • 在创建,编辑或删除对象后在列表视图上保留过滤器

详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件,默认True

24. radio_fields

  • 把外键或choice字段由下拉框变成单选框

原样式:

radio_fields = {"A": admin.VERTICAL}

radio_fields = {"A": admin.HORIZONTAL}

在这里插入图片描述

25. autocomplete_fields

  • 自动补全, 针对外键设置

注意:此属性设置的值绑定的外键必须启用search_fields

autocomplete_fields = ['X']

26. raw_id_fields

  • 自动补全外键或多对多字段内容,并且设置显示其id
raw_id_fields = ['X']


27. readonly_fields

  • 设置为只读字段
readonly_fields = ('B',)


28. save_as

  • 在表单上启用“另存为”功能(默认False)

在编辑页面将”保存并添加另一个“ 更改为“保存成新的”

save_as = True

29. save_as_continue

  • 点击保存为新的后是否跳转

当save_as=True,节省了新对象后的默认重定向是该对象的编辑视图。如果设置了 save_as_continue=False,重定向将转到编辑列表视图。(默认True)

30. save_on_top

  • 在表单顶部添加保存按钮(默认False)
在这里插入代码片

save_on_top = True

31. search_fields

  • 启用搜索框

32. show_full_result_count

  • 控制是否应在过滤的页面上显示对象的全部数量(默认True)

True显示为“总共”多少; False显示为“显示全部”

show_full_result_count = False

在这里插入图片描述

33. sortable_by

  • 允许的字段参与排序
sortable_by = ('B', )

只让其元组内的字段参与排序 ,其余字段将不可进行排序

34. view_on_site

  • 控制是否显示“在站点上查看”按钮是否显示(默认True)

当在模型中有get_absolute_url() 方法,则在修改页面显示 “在站点上查看”,可以通过将view_on_site 设置为False 不显示此按钮
注:关于get_absolute_url() 请自行阅读路由反向解析

# models.py
from django.db import models
from django.urls import reverse

class DataBaseA(models.Model):
   A = models.CharField(max_length=100, choices=(('a', 'A'), ('b', 'B'), ('c', 'C')))
   B = models.CharField(max_length=100, blank=True, null=True)
   C = models.CharField(max_length=100, blank=True, null=True)
   D = models.DateField(blank=True, null=True)

   def get_absolute_url(self):
       return reverse('home')


在 amdin.py 中存在view_on_site() 方法也会显示此功能

class DataBaseAdminA(admin.ModelAdmin):

    def view_on_site(self, obj):
        url = reverse('home')
        return 'http://127.0.0.1:8000' + url
        
	list_display = ('A', 'B', 'C')
	
admin.site.register(DataBaseA, DataBaseAdminA)        
  • 20
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值