7、自定义管理站点

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、添加关联的对象

此时后台页没有显示多个选项,有两个方法解决

  1. 后台注册Choice
    polls/admin中:
admin.site.register(Choice)

在这里插入图片描述
Question是一个包含数据所有投票的选择框。Django知道要将foreignKey在后台中以选择框< select >的形式展示,此时,我们只有一个投票
在这里插入图片描述
还有一点需要注意,在问题旁边有一个添加按钮,
在这里插入图片描述

这是一种低效的添加“选项”的方法,更好的方法是在你创建“投票”对象时直接添加好几个选项:

  1. 在创建“投票”对象时直接添加好几个选项
    移除调用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)自定义你的工程的模板

  1. 创建一个工程模板目录templates(和manage.py同级)在vote/settings中设置dirs

在这里插入图片描述

  1. 创建templates/admin目录,将django的管理页面模板目录中的模板文件admin/base_site.html复制到该目录中
    查找django源码:py -c "import django;print(django.__path__)"
    在这里插入图片描述
    在这里插入图片描述

  2. 用网页站点的名字编辑文件内的{{ site_header|default:_( ‘Djangoadministration’ ) }}
    在这里插入图片描述
    在这里插入图片描述

所有的Django默认后台模板均可被复写,要复写模板就像我们刚刚那样做就可以——先从默认目录拷贝到自定义目录然后再做修改

(2)自定义你应用的模板

为什么当DIRS为空时,Django也能够找到模板文件呢,因为APP_DIRS被设置为True,Django会自动在每个应用包内递归查找templates目录,而 django/contrib/admin 也是一个目录

我们的投票应用并不复杂,所以无需自定义后台模板

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值