2017-06-21 201 views
2

我是新的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' 

项目/部件/ filter.html:

<h1>TEST</h1> 

但它并未使新模板,而是它仍旧呈现旧的方式。

你能给我一些提示吗?

+0

你如何使用这个小部件的形式? –

+0

@DanielRoseman我已编辑我的文章 – Flo

+0

您正在使用哪个Django版本? – SebCorbin

回答

5

Django的版本< 1.11:

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:

以呈现不同的模板窗口小部件必须实现render方法renderer's documentation,我们可以找到以下内容:

新在Django 1.11:

在旧版本中,窗口小部件都使用Python渲染。本文档中描述的所有API都是新的。

而且具有看看widget source code特别是如何在Input插件扩展了Widget类,我们可以看到,你只需要自定义窗口小部件如下:

class MultiChoiceFilterWidget(forms.widgets.CheckboxSelectMultiple): 
    template_name = 'project/widgets/filter.html' 

哪个你已经拥有了什么。

+0

如果我没有弄错,它将需要'return mark_safe(render_to_string(self.template_name))'。 – jhrr

+1

的确,@jhrr,我会解决它。 –