为什么在我写作时
{% 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 %}
标记呈现文本字段对我来说非常重要,因为我的表单包含许多答案,我希望迭代它们并显示每个文本字段。
欢迎任何帮助。提前谢谢!
答案 0 :(得分:0)
我不认为getattr
模板过滤器非常适合您的用途。我不喜欢has_key
检查,因为它会返回False,即使'field_name' in Form
是True
。
您可以通过在表单上设置属性来使模板标记工作,但对我来说似乎很烦人。更好的方法是使用不同的模板过滤器。
如果您有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 %}