<p><strong>Django版本<;1.11:</strong></p>
<p>小部件必须实现<code>render</code>方法才能呈现不同的模板:</p>
<pre><code>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))
</code></pre>
<p/><hr/>
<strong>Django 1.11版:</strong>
<p>在<a href="https://docs.djangoproject.com/en/1.11/ref/forms/renderers/" rel="noreferrer">renderer's documentation</a>中,我们可以找到以下内容:</p>
<blockquote>
<p>New in Django 1.11:</p>
<p>In older versions, widgets are rendered using Python. All APIs described in this document are new.</p>
</blockquote>
<p>通过查看<a href="https://github.com/django/django/blob/master/django/forms/widgets.py#L267" rel="noreferrer">widget source code</a>,特别是<code>Input</code>小部件如何扩展<code>Widget</code>类,我们可以看到您只需要按如下方式自定义小部件:</p>
<pre><code>class MultiChoiceFilterWidget(forms.widgets.CheckboxSelectMultiple):
template_name = 'project/widgets/filter.html'
</code></pre>
<p>这就是你已经拥有的。</p>