Django 试图呈现自定义表单小部件在我的模板标记中不起作用
我有一个模板标签,可以为我呈现一些自定义表单小部件。当我升级到Django 1.8时,它停止了工作。我正在想办法解决这个问题 最终在表单字段的模板中呈现的是:Django 试图呈现自定义表单小部件在我的模板标记中不起作用,django,django-forms,django-templates,django-views,Django,Django Forms,Django Templates,Django Views,我有一个模板标签,可以为我呈现一些自定义表单小部件。当我升级到Django 1.8时,它停止了工作。我正在想办法解决这个问题 最终在表单字段的模板中呈现的是: 在下面的模板标记中,我认为问题出在render_to_字符串中。有什么建议吗 这是我的模板标签: from django import template from django.template import loader, RequestContext from django.template.defaultfilters impor
在下面的模板标记中,我认为问题出在render_to_字符串中。有什么建议吗
这是我的模板标签:
from django import template
from django.template import loader, RequestContext
from django.template.defaultfilters import slugify
register = template.Library()
@register.tag
def render_form(parser, token):
"""Renders dynamic form accordingly"""
bits = token.split_contents()
if len(bits) < 2:
raise template.TemplateSyntaxError("%r tag takes at least one argument" % bits[0])
form = bits[1]
args = {}
# Parse extra "asvar" if given
if len(bits) > 2:
biter = iter(bits[2:])
for bit in biter:
if bit == "as":
args["asvar"] = biter.next()
else:
raise template.TemplateSyntaxError("%r tag got an unknown argument: %r" % (bits[0], bit))
return RenderFormNode(form, **args)
class RenderFormNode(template.Node):
def __init__(self, form, asvar=None):
self.form = form
self.asvar = asvar
def render(self, context):
context = context or {}
form = template.Variable(self.form).resolve(context)
try:
request = template.Variable('request').resolve(context)
except template.VariableDoesNotExist:
raise template.VariableDoesNotExist("The `render_form` template tag requires that the request context processor be enabled.")
# The question type is used to build out the template type.
template_path_context = {
'type': slugify(form.template_type)
}
template_list = [
'appname/question_types/%(type)s/form.html' % template_path_context,
'appname/question_types/%(type)s.html' % template_path_context,
'appname/%(type)s/form.html' % template_path_context,
'appname/form.html' % template_path_context
]
# Renders form, and saves to self.asvar if requested
context.update({'form': form})
rendered = loader.render_to_string(
template_list,
context
)
if self.asvar:
context[self.asvar] = rendered
return ''
return rendered
来自django导入模板的
从django.template导入加载器,RequestContext
从django.template.defaultfilters导入slugify
register=template.Library()
@register.tag
def呈现形式(解析器、令牌):
“”“相应地呈现动态表单”“”
位=标记。拆分内容()
如果len(位)<2:
提升模板.TemplateSyntaxError(“%r”标记至少接受一个参数“%bits[0]”)
形式=位[1]
args={}
#如果给定,则解析额外的“asvar”
如果len(位)>2:
比特=iter(比特[2:])
对于比特中的比特:
如果位==“as”:
args[“asvar”]=位。下一步()
其他:
raise template.TemplateSyntaxError(“%r”标记获得未知参数:%r“%(位[0],位))
返回RenderFormNode(表单,**args)
类RenderFormNode(template.Node):
def uuu init(self,form,asvar=None):
self.form=form
self.asvar=asvar
def呈现(自身、上下文):
上下文=上下文或{}
form=template.Variable(self.form).resolve(context)
尝试:
request=template.Variable('request').resolve(上下文)
除template.VariableDoesNotExist外:
raise template.variabledesnotexist(“render\u form”模板标记要求启用请求上下文处理器。”)
#问题类型用于构建模板类型。
模板路径上下文={
“类型”:slugify(form.template\u类型)
}
模板列表=[
'appname/question\u types/%(type)s/form.html'%template\u path\u context,
'appname/question\u types/%(type)s.html'%template\u path\u context,
'appname/%(type)s/form.html'%template\u path\u context,
'appname/form.html'%template\u path\u context
]
#呈现表单,并在请求时保存到self.asvar
update({'form':form})
rendered=loader.render\u到\u字符串(
模板列表,
上下文
)
如果self.asvar:
上下文[self.asvar]=呈现
返回“”
归还
以下是小部件模板:
<div class="radio-button-block">
{% for fields in form %}
{% if forloop.first %}
<label>{{ fields.label|linebreaks }}</label>
<div class="radio-button">
{% endif %}
{% for field in fields %}
<div class="field">
{{ field }}
{% if field.errors %}
{% for error in field.errors %}
<div class="ui negative message">
{{ error }}
</div>
{% endfor %}
{% endif %}
{% if field.choice_feedback %}
<div class="feedback">
{{ field.choice_feedback|linebreaks }}
<a class="close-feedback ss-icon">close</a>
</div>
{% endif %}
</div>
{% endfor %}
{% endfor %}
</div>
</div>
{%形式的字段为%}
{%if-forloop.first%}
{{fields.label | linebreaks}}
{%endif%}
{字段%中的字段为%1}
{{field}}
{%if field.errors%}
{%字段中有错误。错误%}
{{error}}
{%endfor%}
{%endif%}
{%if field.choice_feedback%}
{{field.choice}反馈{换行}
关闭
{%endif%}
{%endfor%}
{%endfor%}
也许你应该显示模板?只是添加了小部件模板