Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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
Python Django:从html模板访问自定义模型字段的属性_Python_Django_Django Forms - Fatal编程技术网

Python Django:从html模板访问自定义模型字段的属性

Python Django:从html模板访问自定义模型字段的属性,python,django,django-forms,Python,Django,Django Forms,我实现了一个自定义模型字段: class CustomCharField(models.CharField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.my_attr = "MY_ATTR" 现在,当我在change\u form\u template中迭代所有模型的字段时,我希望能够显示该附加属性: {% block fi

我实现了一个自定义模型字段:

class CustomCharField(models.CharField):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attr = "MY_ATTR"
现在,当我在
change\u form\u template
中迭代所有模型的字段时,我希望能够显示该附加属性:

{% block field_sets %}
    {% for fieldset in adminform %}
        {% for line in fieldset %}
            {% for field in line %}
                {{ field.field }}

                {% if field.field.my_attr %}
                    {{ field.field.my_attr }}
                {% endif %}

            {% endfor %}
        {% endfor %}
    {% endfor %}
{% endblock %}
不幸的是,
my_attr
不可见。我在django文档中搜索合适的方法,但没有成功。我还尝试使用定制的
form\u类
(继承自
django.forms.fields.CharField

编辑:

好的,我需要自定义表单字段和模型字段。给定以下代码,我应该更改什么以使其工作?(当然,我忽略了在该示例中传递属性值)。为什么
CustomFormField
中的
my\u attr
仍然无法从模板访问

class CustomFormField(fields.CharField):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attr = "MY_ATTR2"

class CustomCharField(models.CharField):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attr = "MY_ATTR"

    def formfield(self, **kwargs):
        defaults = {'form_class': CustomFormField}
        defaults.update(kwargs)
        return super().formfield(**defaults)

好的,多亏了@AbdulAzizBarkat和@Guillaume的建议,我终于设法解决了这个问题

为了在HTML模板中公开模型字段的属性,还需要实现自定义表单字段,并在
default
dict In
formfield
方法中传递属性:

from django.db import models
from django.forms import fields

class CustomFormField(fields.CharField):
    def __init__(self, my_attr, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attr = my_attr


class CustomCharField(models.CharField):
    def __init__(self, my_attr, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.my_attr = my_attr

    def formfield(self, **kwargs):
        defaults = {'form_class': CustomFormField, "my_attr": self.my_attr}
        defaults.update(kwargs)
        return super().formfield(**defaults)

另一个更改是通过设置
change\u form\u template
值来访问HTML模板中的属性的方式。在这种情况下,它应该是
{{field.field.field.my_attr}

如果您想在模板中自定义字段,您需要创建自己的
表单.CharField
,而不是
模型.CharField
。否则,这就像试图在模板中显示另一个模型字段属性,而这是不可能的(例如,您不能在模板中打印
字段。默认值
字段。必填项
)。您在此处创建自定义模型字段
CustomCharField(models.CharField)
而不是表单字段<代码>字段。字段
提供绑定字段的表单字段,而不是模型字段。@Guillaume谢谢,我编辑了这个问题。谢谢,@AbdulAzizBarkat