Django 编写您的第一个Django应用 六
自定义管理表单
通过使用来注册Question
模型admin.site.register(Question)
,Django能够构建默认的表单表示形式。
通常,您需要自定义管理表单的外观和工作方式。您可以通过在注册对象时告诉Django所需的选项来做到这一点。
让我们通过重新排列编辑表单中的字段来查看其工作原理。将admin.site.register(Question)
行替换为:
您将遵循这种模式–创建模型管理类,然后将其作为第二个参数传递给admin.site.register()
–每当您需要更改模型的管理选项时。
上面的特定更改使“发布日期”位于“问题”字段之前:
谈到包含数十个字段的表单,您可能需要将表单拆分为多个字段集:
添加相关对象
好的,我们有我们的Question管理员页面,但是a Question
有多个 Choice
,并且admin页面不显示选择。
然而。
有两种方法可以解决此问题。首先是Choice
像在admin上一样向管理员注册Question
:
现在,“选择”是Django管理员中的可用选项。“添加选择”表单如下所示:
以这种形式,“问题”字段是一个选择框,其中包含数据库中的每个问题。Django知道ForeignKey
应在admin中将a表示为一个<select>
框。在我们的情况下,此时仅存在一个问题。
另外请注意“问题”旁边的“添加其他”链接。每个与ForeignKey
另一个有关系的对象 都可以免费获得。当您单击“添加另一个”时,将出现一个带有“添加问题”表单的弹出窗口。如果您在该窗口中添加问题并单击“保存”,则Django会将问题保存到数据库中,并将其动态添加为您要查看的“添加选择”表单上的选定选项。
但是,实际上,这是Choice
向系统添加对象的一种低效方式。如果在创建Question
对象时可以直接添加一堆Choices,那会更好 。让我们做到这一点。
删除register()
对Choice
模型的调用。然后,编辑Question
注册码以读取:
这告诉Django:“ Choice
对象是在Question
管理页面上编辑的。默认情况下,为3个选项提供足够的字段。”
加载“添加问题”页面以查看外观:
它的工作方式是这样的:相关选择有3个插槽(按指定),extra
并且每次您回到已创建对象的“更改”页面时,都会获得另外三个插槽。
在当前三个插槽的末尾,您将找到“添加另一个选择”链接。如果单击它,将添加一个新插槽。如果要删除添加的插槽,可以单击添加的插槽右上方的X。请注意,您无法删除原来的三个插槽。此图显示了一个添加的插槽:
不过,这是一个小问题。显示所有用于输入相关<span>Choice</span>
对象的字段需要大量屏幕空间。因此,Django提供了一种表格式的方式来显示与内联相关的对象。
要使用它,请将<span>ChoiceInline</span>
声明更改为 :
自定义管理员更改列
现在问题管理页面看起来不错,让我们对“更改列表”页面进行一些调整,该页面显示了系统中的所有问题。
这是现在的样子:
默认情况下,Django显示<span>str()</span>
每个对象的。但是有时候,如果我们可以显示单个字段,那会更有帮助。
为此,请使用 <span>list_display</span>
admin选项,它是字段名称的元组,可以在对象的更改列表页面上以列形式显示:
您可以单击列标题以这些值进行排序-标题除外was_published_recently
,因为不支持按任意方法的输出进行排序。还要注意,was_published_recently
默认情况下,for的列标题 是方法的名称(下划线用空格替换),并且每一行都包含输出的字符串表示形式。
您可以通过为该方法(在中polls/models.py
)提供一些属性来改进该属性,如下所示:
这会添加一个“过滤器”侧边栏,使人们可以按<span>pub_date</span>
字段过滤更改列表 :
显示的过滤器类型取决于您要过滤的字段类型。因为pub_date
是DateTimeField
,Django知道提供适当的过滤器选项:“任何日期”,“今天”,“过去7天”,“本月”,“今年”。
这很好。让我们添加一些搜索功能:
search_fields = [‘question_text‘]
这将在更改列表的顶部添加一个搜索框。当有人输入搜索词时,Django将搜索该<span>question_text</span>
字段。您可以根据需要使用任意多个字段-尽管由于它<span>LIKE</span>
在后台使用查询,所以将搜索字段的数量限制为合理的数量将使数据库更容易进行搜索。
自定义项目模板
templates
在您的项目目录中创建一个目录(包含的目录manage.py
)。模板可以存放在Django可以访问的文件系统上的任何位置。
(Django以服务器运行的任何用户身份运行。)但是,将模板保留在项目中是一个很好的习惯。
打开设置文件(mysite/settings.py
,请记住),然后DIRS
在templates
设置中添加一个 选项:
<span>DIRS</span>
是加载Django模板时要检查的文件系统目录的列表;这是一个搜索路径。
自定义您的应用程序模板
精明的读者会问:但是,如果DIRS
默认情况下为空,那么Django如何找到默认的管理模板?答案是,由于APP_DIRS
设置为True
,Django会自动templates/
在每个应用程序包中查找一个子目录,以用作备用(不要忘记这 django.contrib.admin
是一个应用程序)。
我们的民意调查应用程序不是很复杂,不需要自定义管理模板。但是,如果它变得更加复杂,并且需要对其某些功能进行Django标准管理模板的修改,那么修改应用程序的模板而不是项目中的模板 将更为明智。这样,您可以在任何新项目中包含民意调查应用程序,并确保它会找到所需的自定义模板。
自定义管理索引页面
类似地,您可能想要自定义Django admin索引页面的外观。
默认情况下,它将INSTALLED_APPS
按字母顺序显示已在admin应用程序中注册的所有应用程序。您可能需要对布局进行重大更改。毕竟,索引可能是管理员最重要的页面,并且应该易于使用。
要自定义的模板为admin/index.html
。(与admin/base_site.html
上一节中的操作相同 –将其从默认目录复制到您的自定义模板目录中)。编辑文件,您将看到它使用名为的模板变量app_list
。该变量包含每个已安装的Django应用。您可以使用您认为最好的任何方式来硬编码指向特定于对象的管理页面的链接,而不必使用它。