向表单字段附加额外信息

6 投票
1 回答
1040 浏览
提问于 2025-04-16 01:05

我正在尝试向Django表单的字段传递一些额外的信息,以便在模板中显示。我试着重写构造函数,并像这样给字段添加另一个属性:

self.fields['field_name'].foo = 'bar'

但是在模板中,这个:

{{ form.field_name.foo }}

什么都没有打印出来。有没有人知道怎么在不重写或继承表单字段类的情况下,给字段添加额外的信息?

1 个回答

7

根据 django.forms.forms 的说明,Form__getitem__() 方法会把一个叫做 BoundField 的东西从字段中创建出来,然后再返回,这样就把你做的任何修改都去掉了。如果你真的想在这个过程中增加一些功能,可以重写这个方法,在返回之前对绑定字段进行一些处理:

class MyForm(forms.Form):
    def __getitem__(self, name):
        boundfield = super(forms.Form,self).__getitem__(name)
        boundfield.foo = "bar"
        return boundfield

这样,"bar" 就会在表单中的所有字段上显示出来。你也可以写一个函数来代替这样做,这样就不只是一个死字符串了。

虽然通常情况下,我们会添加更多的字段,或者给表单本身添加属性,但如果你有一整类新的信息需要每个字段都包含,这样做可能会对你有帮助。


另一种实现相同效果的方法是编辑字段的一个属性,然后通过 BoundField"field" 属性来访问它:

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs)
        super(forms.Form, self).__init__(*args, **kwargs)
        self.fields['field_name'].foo = "bar"

然后,在模板中访问 foo

{{ form.field_name.field.foo }}

撰写回答