Django表格提供额外信息

时间:2012-03-25 02:12:12

标签: python django forms

我有一个模型,其中包含一些永远不应编辑的字段,例如“创建日期”。我想显示一个包含一些带有额外信息的文本字段的表单,可能只是<span>中的数据本身。一个人可以编辑一些字段,同时他们可以看到有关模型实例的额外信息,例如创建的,最后修改的,甚至数据库中该对象的相关对象。有没有办法使用Django的内置框架,或者我必须通过将整个对象传递给模板来创建自己的自定义表单?

如果需要更多说明,请随时提出。

2 个答案:

答案 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()