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)
{% 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)
{% 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。如果这是不可能的,有任何想法可以获得理想的解决方法吗?
答案 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 }}
。