上一篇:Python之Django系列-创建第一个应用-8
这一篇我们主要会讲到投票应用后台表单,之前我们的后台表单很简单,现在我们来丰富下
我们先了解下后台表单字段位置的摆放,如下代码:
我们创建QuestionAdmin类并继承ModelAdmin类,字段顺序的位置主要依赖类中的fields变量中数组的顺序,最终我们启动服务,看到如图:
日期属性在前,问题标题属性在后,但是如果表单字段很多,这样排版就不是很直观,我们再调整如下:
fieldsets 元组中的第一个元素是字段集的标题。以下是我们的表单现在的样子:
现在为我们的Question表单添加关联对象
现在 "Choices" 在 Django 后台页中是一个可用的选项了。“添加选项”的表单看起来像这样:
在这个表单中,"Question" 字段是一个包含数据库中所有投票的选择框。Django 知道要将 ForeignKey 在后台中以选择框 的形式展示。此时,我们只有一个投票。
同时也注意下 "Question" 旁边的“添加”按钮。每个使用 ForeignKey 关联到另一个对象的对象会自动获得这个功能。当你点击“添加”按钮时,你会见到一个包含“添加投票”的表单。如果你在这个弹出框中添加了一个投票,并点击了“保存”,Django 会将其保存至数据库,并动态地在你正在查看的“添加选项”表单中选中它。
不过,这是一种很低效地添加“选项”的方法。更好的办法是在你创建“投票”对象时直接添加好几个选项。让我们实现它。
移除调用 register() 注册 Choice 模型的代码。随后,像这样修改 Question 的注册代码:
这会告诉 Django:“Choice 对象要在 Question 后台页面编辑。默认提供 3 个足够的选项字段。”
加载“添加投票”页面来看看它长啥样:
它看起来像这样:有三个关联的选项插槽——由 extra 定义,且每次你返回任意已创建的对象的“修改”页面时,你会见到三个新的插槽。
在三个插槽的末端,你会看到一个“添加新选项”的按钮。如果你单击它,一个新的插槽会被添加。如果你想移除已有的插槽,可以点击插槽右上角的X。注意,你不能移除原始的 3 个插槽。以下图片展示了一个已添加的插槽:
不过,仍然有点小问题。它占据了大量的屏幕区域来显示所有关联的 Choice 对象的字段。对于这个问题,Django 提供了一种表格式的单行显示关联对象的方法。要使用它,只需按如下形式修改 ChoiceInline 申明:
class ChoiceInline(admin.TabularInline):
通过 TabularInline``(替代 ``StackedInline ),关联对象以一种表格式的方式展示,显得更加紧凑:
现在投票的后台页看起来很不错,让我们对“更改列表”页面进行一些调整——改成一个能展示系统中所有投票的页面。
以下是它此时的外观:
默认情况下,Django 显示每个对象的 str() 返回的值。但有时如果我们能够显示单个字段,它会更有帮助。为此,使用 list_display 后台选项,它是一个包含要显示的字段名的元组,在更改列表页中以列的形式展示这个对象:
我们在把 was_published_recently() 方法也加上:
现在修改投票的列表页看起来像这样:
你可以点击列标题来对这些行进行排序——除了 was_published_recently 这个列,因为没有实现排序方法。顺便看下这个列的标题 was_published_recently,默认就是方法名(用空格替换下划线),该列的每行都以字符串形式展示出处。
你可以通过给这个方法(在 polls/models.py 中)一些属性来达到优化的目的,像这样:
同时再加上如下代码在 polls/admin.py中
list_filter = ['pub_date']search_fields = ['question_text']
这样会增加一个搜索框以及侧边的筛选栏,如图:
现在我们要复写Django包里面部分元素,该怎么做呢,首先,我们得在manage.py当前位置创建一个templates目录,然后再创建一个admin目录,这个admin目录就可以看做是Django默认的admin应用,最终路径为mysite/templates/admin,创建好目录之后,我们还要做的就是修改mysite/mysite/settings.py文件,如下:
这样服务启动的时候,会扫描根目录下的templates目录,然后再去INSTALLED_APPS变量下找到对应的应用,最终会复写该应用下的模板文件,现在我们想要修改Django admin界面的标题,我们要找到Django admin应用的路径,怎么找呢,输入如下命令:
py -c "import django; print(django.__path__)"
然后我们找到base_site.html文件拷贝到mysite/templates/admin目录下,我们修改下标题为:
保存,然后打开浏览器http://127.0.0.1:8000/admin/
下一篇:Python之Django系列-投票应用打包-10