使用自定义 getattr templatetag 时 Django 表单字段不呈现

Django form field not rendering when using custom getattr templatetag

为什么我写的时候

{% with "answer_1" as ans %}
    {{ form|getattr:ans }}
{% endwith %}

我明白了

<django.forms.fields.CharField object at 0x7fdea0f0a210>

在我的模板中,但是当我写的时候

{{ form.answer_1 }}

我得到正确呈现的文本字段?

我的 getattribute 模板标签如下所示:

@register.filter(name='getattr')
def getattribute(value, arg):
    if hasattr(value, arg):
        return getattr(value, arg)
    elif hasattr(value, 'has_key') and arg in value:
        return value[arg]
    else:
        return settings.TEMPLATE_STRING_IF_INVALID

能够使用 {% with %} 标记呈现文本字段对我来说非常重要,因为我的表单包含许多答案,我希望迭代它们并为每个答案显示一个文本字段。

欢迎任何帮助。提前致谢!

使用不同的模板过滤器

我认为 getattr 模板过滤器不太适合您的目的。我不喜欢 has_key 检查,因为它会 return False,即使 'field_name' in FormTrue.

您或许可以通过在表单上设置属性来使模板标签起作用,但对我来说这似乎很老套。更好的方法是使用不同的模板过滤器。

如果您有 form,则可以使用 form['answer_1'] 访问字段 answer_1。使用这些知识,可以轻松创建更合适的模板过滤器。

@register.filter(name='get_form_field')
def get_form_field(form, field_name):
    try:
        return form[field_name]
    except KeyError:
        return settings.TEMPLATE_STRING_IF_INVALID

然后,在你的模板中,你可以做

{{ form|get_form_field:"answer_1" }}

或者,如果您使用的是 with 模板标签:

{% with "answer_1" as ans %}
    {{ form|get_form_field:ans }}
{% endwith %}

或尝试不同的方法

实际上,我不确定您是否需要特殊的模板过滤器。您可以在表单中添加一个方法,return 是您要显示的字段列表。

class MyForm(forms.Form):
    def answer_fields(self):
        return [self['answer_%d' % x] for range(1, 5)] 

然后在您的模板中,遍历列表并呈现它们。

{% for field in form.answer_fields %}
    {{ form.answer_fields }}
{% endfor %}