使用自定义 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 Form
是 True
.
您或许可以通过在表单上设置属性来使模板标签起作用,但对我来说这似乎很老套。更好的方法是使用不同的模板过滤器。
如果您有 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 %}
为什么我写的时候
{% 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 Form
是 True
.
您或许可以通过在表单上设置属性来使模板标签起作用,但对我来说这似乎很老套。更好的方法是使用不同的模板过滤器。
如果您有 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 %}