我有一个模型,其中包含一些永远不应编辑的字段,例如“创建日期”。我想显示一个包含一些带有额外信息的文本字段的表单,可能只是<span>
中的数据本身。一个人可以编辑一些字段,同时他们可以看到有关模型实例的额外信息,例如创建的,最后修改的,甚至数据库中该对象的相关对象。有没有办法使用Django的内置框架,或者我必须通过将整个对象传递给模板来创建自己的自定义表单?
如果需要更多说明,请随时提出。
答案 0 :(得分:1)
为此,我通常会自定义表单,以便只读取窗口小部件,如下所示:
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'my_field': forms.TextInput(attrs={'disabled':'disabled'}),
}
这将输出一个只读文本字段,但我想你也可以创建一个只输出<div>
或<p>
(或你需要的任何东西)的小部件
答案 1 :(得分:1)
我知道这样做的最好方法是在将表单传递给模板之前初始化字段,方法是将initial
字典传递给表单,或者将instance
对象传递给表单。
然后,您应该确保禁用这些字段,或者您应该将它们设为隐藏字段,然后将这些字段显示为常规文本。
最重要的是,如果您将数据传递给客户端,然后以表格形式发送回来,您应该确保进入的数据与发出的数据相同(出于安全考虑)。使用表单上的clean_[field]
函数执行此操作。它应该如下所示。
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_date_created(self):
if self.cleaned_fields['date_created'] != self.instance.date_created:
raise ValidationError, 'date_created has been tampered'
self.cleaned_fields['date_created']
[编辑/附录]或者,您可以将数据直接传递到模板以单独渲染,然后在将数据恢复到视图后将数据添加到表单中。它应该是这样的:
def recieve_form(request, ...):
...
f = MyForm(request.POST, instance=a)
new_model_instance = f.save(commit=False)
new_model_instance.date_created = <whatever>
new_model_instance.save()