使用自定义getattr templatetag时,Django表单字段无法呈现

时间:2015-01-07 13:56:13

标签: django django-forms django-templates

为什么在我写作时

{% 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 %}标记呈现文本字段对我来说非常重要,因为我的表单包含许多答案,我希望迭代它们并显示每个文本字段。

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

1 个答案:

答案 0 :(得分:0)

使用其他模板过滤器

我不认为getattr模板过滤器非常适合您的用途。我不喜欢has_key检查,因为它会返回False,即使'field_name' in FormTrue

您可以通过在表单上设置属性来使模板标记工作,但对我来说似乎很烦人。更好的方法是使用不同的模板过滤器。

如果您有form,则可以使用answer_1访问字段form['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 %}

或尝试不同的方法

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

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 %}