目录
- 1、自定义后台表单
- 2、添加关联的对象
- 3、自定义后台更改列表
- 4、自定义后台界面和风格
- (1)自定义你的工程的模板
- (2)自定义你应用的模板
1、自定义后台表单
通过admin.site.register(Question)注册Question模型,Django能够构建一个默认的表单用于展示。一般来讲,我们希望能够自定义表单的外观和工作方式。你可以在注册模型时将这些设置告诉Django。
polls/admin.py:
class QuestionAdmin(admin.ModelAdmin):
fields = ["pub_date","question_text"]
admin.site.register(Question,QuestionAdmin)
通过以上操作,我们将pub_date参数放在了question_text的前面
更通常的情况同一个表单有数十个字段,为表单选择一个直观的排序方法就需要更细致地划分
对于拥有数十个字段的表单 我们更倾向于将表单划分为几个字段集
在polls/admin中
# Register your models here.
from django.contrib import admin
from .models import Question
class QuestionAdmin(admin.ModelAdmin):
# fields = ["pub_date","question_text"]
fieldsets=[
(None,{"fields":["question_text"]}),
("Data information",{"fields":["pub_date"]}),#“Data information”是字段集的标题
]
admin.site.register(Question,QuestionAdmin)
2、添加关联的对象
此时后台页没有显示多个选项,有两个方法解决
- 后台注册Choice
polls/admin中:
admin.site.register(Choice)
Question是一个包含数据所有投票的选择框。Django知道要将foreignKey在后台中以选择框< select >的形式展示,此时,我们只有一个投票
还有一点需要注意,在问题旁边有一个添加按钮,
这是一种低效的添加“选项”的方法,更好的方法是在你创建“投票”对象时直接添加好几个选项:
- 在创建“投票”对象时直接添加好几个选项
移除调用register()注册Choice模型的代码,修改Question的注册代码:(polls/admin)
class ChoiceInline(admin.StackedInline):#内内联模型管理员类
model = Choice
extra = 3#extra 设置了在管理后台中添加新 Choice 对象时显示的空白表单数量,这里设置为 3
class QuestionAdmin(admin.ModelAdmin):
# fields = ["pub_date","question_text"]
fieldsets=[
(None,{"fields":["question_text"]}),
("Data information",{"fields":["pub_date"],"classes":["collapse"]}),
]#classes 键包含一个类列表,指定这个分组的 CSS 类,这里是 collapse,用于在管理后台中折叠这一部分
inlines = [ChoiceInline]
admin.site.register(Question,QuestionAdmin)
如果让显示关联的Choice对象的字段占的屏幕空间更小一些会更好:
3、自定义后台更改列表
对更改列表进行调整,使得其能够展示系统中所有投票的页面
此时的外观为:
默认情况下,Django显示每个对象的“str()”但是如果能够显示单个字段会更有帮助。为此,我们要使用attr:~django.contrib.ModelAdmin.list_display admin选项,(在对象的更改列表页上以列形式显示的字段名称列表)
polls/admin
class QuestionAdmin(admin.ModelAdmin):
#...
list_display = ["question_text","pub_date","was_published_recently"]
可以在这个方法上 使用display()装饰器来改进,polls/models
class Question(models.Model):
#...
@admin.display(
boolean=True,
ordering="pub_date",
description="Published recently"
)
def was_published_recently(self):
now=timezone.now().date()
return now-datetime.timedelta(days=1) <= self.pub_date <= now
再次编辑polls/admin 优化Question变更页,允许人们以pub_date字段来过滤列表
list_filter = ["pub_date"]
添加功能——搜索
search_fields = ["question_text"]
4、自定义后台界面和风格
后台显示Django管理有点呆,我们可以通过F=Django的模板系统来修改
(1)自定义你的工程的模板
- 创建一个工程模板目录templates(和manage.py同级)在vote/settings中设置dirs
-
创建templates/admin目录,将django的管理页面模板目录中的模板文件admin/base_site.html复制到该目录中
查找django源码:py -c "import django;print(django.__path__)"
-
用网页站点的名字编辑文件内的{{ site_header|default:_( ‘Djangoadministration’ ) }}
所有的Django默认后台模板均可被复写,要复写模板就像我们刚刚那样做就可以——先从默认目录拷贝到自定义目录然后再做修改
(2)自定义你应用的模板
为什么当DIRS为空时,Django也能够找到模板文件呢,因为APP_DIRS被设置为True,Django会自动在每个应用包内递归查找templates目录,而 django/contrib/admin 也是一个目录
我们的投票应用并不复杂,所以无需自定义后台模板