2017-06-21 205 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,我會解決它。 –