4

Django 做什么

Django 的模型字段“空白”属性,以及当您创建模型表单时它被否定并变成表单字段“必需”属性的方式非常酷。它允许我在它所属的模型上设置属性,但在处理从它创建的 ModelForm 时具有可用的“必需”属性。在模板中渲染时使用“必需”意味着我可以做一些很酷的事情,比如在必填字段的显示标签上添加一个星号。

模型

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 %}

我想要它做什么

但是如果我想用我自己的新属性来做到这一点呢?它不需要像空白-> 必需那样被否定/翻译,但我希望在模型字段上定义的新属性可以在我的表单字段上访问。例如,假设我想向用户明确可能会发布哪些字段:

模型

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。如果这是不可能的,有什么解决方法可以获得所需行为的想法吗?

4

2 回答 2

1

请注意,可发布应该是 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
于 2010-10-10T06:48:27.310 回答
0

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

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

#...

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

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

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

于 2010-10-11T07:50:13.260 回答