Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django模型字段上设置任意属性,然后以模型形式访问它们? Django做什么_Django_Django Forms_Keyword Argument - Fatal编程技术网

如何在Django模型字段上设置任意属性,然后以模型形式访问它们? Django做什么

如何在Django模型字段上设置任意属性,然后以模型形式访问它们? Django做什么,django,django-forms,keyword-argument,Django,Django Forms,Keyword Argument,Django的Model-Field“blank”属性,以及在创建ModelForm时它被否定并变成Form-Field“required”属性的方式,非常酷。它允许我在它所属的模型上设置属性,但在处理从中创建的ModelForm时,“required”属性可用。在模板中进行渲染时,使用“required”意味着我可以做一些很酷的事情,比如在required字段的显示标签上添加星号 模型 模板(使用ModelForm) 模板(使用ModelForm) {%用于表单%]中的字段 {field.l

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

模型 模板(使用ModelForm) 模板(使用ModelForm)
{%用于表单%]中的字段

{field.label}{%if field.required%}*{%endif%}
{%if field.publishable%}(可能已发布){%endif%}
{{field}}

{%endfor%}

有没有办法做到这一点?尝试一下,我马上就遇到了模型定义的问题,其中
django.db.models.fields.Field.\uu init\uuu()
甚至不接受kwargs。如果这是不可能的,有什么解决办法来获得所需的行为吗?

请注意,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

您还可以为模型字段创建一种装饰器:

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

#...

name = publishable(models.CharField(...))
然后重写表单的
\uuuu init\uuuu
以使用这些字段


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

两个选项:继承字段(PublishablePositiveInt),这不是很好,或者添加一个新的可发布模型来保存此信息(model\u name,field\u name,Publishable boolean)。最后使用了这个,通过一些调整使其成为动态的-同时在包含可发布字段名列表的模型类上创建一个新的
可发布的\u fields
属性。虽然没有能够在每个单独的模型字段上设置该属性那么干净,但它至少在模型中保留了定义。这实际上是一个不错的折衷方案。谢谢分享。
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 %}
class PublishableForm(forms.Form):
    name = forms.CharField()

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

#...

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