我实现了一个自定义模型字段:
class CustomCharField(models.CharField):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.my_attr = "MY_ATTR"
现在,当我在change_form_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_class
(继承自django.forms.fields.CharField
(
编辑:
好的,所以我需要自定义表单字段和模型字段。给定以下代码,我应该更改什么才能使其工作?(当然,我忽略了在该示例中传递属性值(。为什么CustomFormField
中的my_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模板中公开模型字段的属性,还需要实现自定义表单字段,并在formfield
方法中传递default
dict中的属性:
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_form_template
值指定的HTML模板中的属性的方式。在这种情况下,它应该是{{ field.field.field.my_attr }}