如何在Django模型字段上设置任意属性,然后在ModelForm中访问它们?

时间:2010-10-10 04:02:59

标签: django django-forms kwargs

Django做什么

Django的Model Field“blank”属性,以及在创建ModelForm时它被否定并转换为Form Field“required”属性的方式非常酷。它允许我在它所属的模型上设置属性,但在处理从它创建的ModelForm时具有“required”属性。在模板中渲染时“必需”可用意味着我可以做一些很酷的事情,例如在所需字段的显示标签上添加星号。

模型

class Employee(models.Model):
    name = models.CharField(blank=False)
    public_bio = models.TextField(blank=False)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False)
    personnel_notes = models.TextField(blank=True)

模板(使用ModelForm)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {{ field }}
    </p>
{% endfor %}

我想要它做什么

但是如果我想用自己的新属性做什么呢?它不需要以空白的方式否定/翻译 - &gt;必需的,但我想在我的FormFields上访问我在模型字段上定义的新属性。例如,假设我想向用户明确说明可能发布的字段:

模型

class Employee(models.Model):
    name = models.CharField(blank=False, publishable=True)
    public_bio = models.TextField(blank=False, publishable=True)
    salary= models.DecimalField(max_digits=15, decimal_places=2, blank=False, publishable=False)
    personnel_notes = models.TextField(blank=True, publishable=False)

模板(使用ModelForm)

{% for field in form %}
    <p>
       {{ field.label }}{% if field.required %}*{% endif %}
       {% if field.publishable %}(may be published){% endif %}
       {{ field }}
    </p>
{% endfor %}

有没有办法做到这一点?尝试一下,我立即遇到模型定义的问题,其中django.db.models.fields.Field.__init__()甚至不接受kwargs。如果这是不可能的,有任何想法可以获得理想的解决方法吗?

2 个答案:

答案 0 :(得分:1)

请注意,publishable应该是forms.Field上的属性,而不是models.Field上的属性,因此它将出现在模板中。

您可以在您希望在表单初始化中发布的字段中明确添加它,并且在呈现时可以使用它:

class PublishableForm(forms.Form):
    name = forms.CharField()

    def __init__(*args, **kwargs)
       super(PublishableForm, self).__init__(*args, **kwargs)
       self.name.publishable = True

答案 1 :(得分:0)

您还可以为模型字段制作一种装饰器:

def publishable(field):
    field.publishable = True
    return field

#...

name = publishable(models.CharField(...))

然后覆盖表单的__init__以使用这些字段。

另外请不要忘记在模板中使用{{ form.name }}会返回BoundField。要获取原始表单字段,您应使用{{ form.name.field }}