【问题标题】:Django Form with extra information带有额外信息的 Django 表单
【发布时间】:2024-12-13 03:35:01
【问题描述】:

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

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

【问题讨论】:

  • 您目前如何创建表单?我不知道是否有模型表单的快捷方式,但克劳德的回答显示了我所知道的方式,在表单类中填充 Meta 对象。
  • 我正在使用 ModelForm 和 Form。今晚我将考虑这两个建议,看看我能想出什么。

标签: python django forms


【解决方案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()

【讨论】:

    【解决方案2】:

    为此,我通常自定义表单以使小部件为只读,如下所示:

    class MyForm(forms.ModelForm):
        class Meta:
            model = MyModel
            widgets = {
                'my_field': forms.TextInput(attrs={'disabled':'disabled'}),
            }
    

    这将输出一个只读文本字段,但我想您也可以创建一个只输出 &lt;div&gt;&lt;p&gt;(或任何您需要的)的小部件

    【讨论】: