Django小部件覆盖模板
我是django的新人。
我想创建一个自定义窗口小部件。
forms.py:
from project.widgets import MultiChoiceFilterWidget
class CustomSearchForm(FacetedSearchForm):
TEST_COLORS = [
u"Blau", u"Rot", u"Gelb"
]
color = forms.MultipleChoiceField(
label=_("Color"), choices=[(x, x) for x in TEST_COLORS],
widget=MultiChoiceFilterWidget, required=False)
widget.py:
class MultiChoiceFilterWidget(forms.widgets.CheckboxSelectMultiple):
template_name = 'project/widgets/filter.html'
option_template_name = 'ptoject/widgets/filter_option.html'
project / widgets / filter.html:
<h1>TEST</h1>
但是它不会呈现新模板,而是仍然呈现旧方法。
你能给我一些提示吗?
-
Django版本 <1.11:
小部件必须实现该
render
方法才能呈现不同的模板:from django.utils.safestring import mark_safe from django.template.loader import render_to_string class MultiChoiceFilterWidget(forms.widgets.CheckboxSelectMultiple): template_name = 'project/widgets/filter.html' def render(self, data): ... Do stuff with data ... return mark_safe(render_to_string(self.template_name))
Django 1.11版:
在渲染器的文档中,我们可以找到以下内容:
Django 1.11的新功能:
在旧版本中,小部件是使用Python渲染的。本文档中描述的所有API都是新的。
通过查看小部件的源代码,特别是
Input
小部件如何扩展Widget
类,我们可以看到您只需要按以下方式自定义小部件:class MultiChoiceFilterWidget(forms.widgets.CheckboxSelectMultiple): template_name = 'project/widgets/filter.html'
这是您已经拥有的。