在Django中,在模板中显示表单相当容易:
<form action="" method="post">{% csrf_token %}
{{ form }}
<input type="submit" value="Update" />
</form>
它基本上只有一个字 - 显示 {{ form }}
. 它非常简单,您可以为不同的表单使用相同的模板 .
如果您使用的是CBV(如CreateView或UpdateView),则可以使用 fields = []
列表限制要在表单上显示的字段 .
与此并行绘制,人们期望有一个类似的工作流程来显示模型(而不是编辑),例如在DetailView中 . 但是,没有这样的东西..你必须为你使用的每个DetailView编写一个自定义模板 . 如:
<h3>User: {{ user }}</h3>
<label>First Name</label>: {{ user.first_name }}
<label>Last Name</label>: {{ user.last_name }}
<label>Username</label>: {{ user.username }}
<label>School</label>: {{ user.person.school.name }}
这与 {{ form }}
将生成的内容非常相似,除了此处打印的字段值,而不是在那里打印的 input
.
所以,我想知道,为什么不存在DetailView的可重用通用模板?对此有技术限制,还是不像我想象的那样可重复使用?
2 回答
我认为它不像你想象的那样可重复使用 .
可能有可能定义"standard"方法来渲染简单的模型属性,如
CharField
- 当你进入更复杂的关系字段,如ManyToManyField
,ForeignKey
,OneToOneField
时,这很快就变得不可能了 . 除了最简单的模型之外,您最终会快速覆盖任何默认表示 .其次,Django不是 - 也不应该 - 对你的模型的用途持主观态度,因此它不会试图假设你想要如何渲染它们 .
这与在Django和HTML中定义单个表单字段的结构的形式不同,并且两者之间存在很强的相关性 .
我已经创建并且一直在使用大约一年我自己的通用模板 . 所以,我想分享一下,这里是:
创建视图就像这样简单:
上面使用的DetailViewParent(根据需要覆盖
fields
和exclude
;默认包括all):模板的相关部分:
和模板标签:
模板可根据您的需求和喜好进行定制 . 但我想指出两件事:
1)
get_absolute_url
:如果定义了此(标准django)模型方法,则字段值显示为url .2)
modal-loader
class:这会在客户端触发js以在bootstrap 3模式中显示详细视图 . 此外,如果点击1)中提到的链接加载到同一模态上,则可以更轻松地浏览详细视图 . 它还有一个"back"按钮可以返回上一个模型的视图 . 我不是在这里包括它,因为它是很多代码,超出了这个问题的范围 .