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 Informfield
方法中传递属性:
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