首页 > 解决方案 > Django:从 html 模板访问自定义模型字段的属性

问题描述

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

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

编辑:

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

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)

标签: pythondjangodjango-forms

解决方案


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

为了在 HTML 模板中公开模型字段的属性,还需要实现自定义表单字段并default在方法中传递 dict 中的属性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_form_template值指定的 HTML 模板中的属性的方式。在这种情况下,它应该是{{ field.field.field.my_attr }}


推荐阅读