Django小部件覆盖模板

发布于 2021-01-29 18:27:55

我是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>

但是它不会呈现新模板,而是仍然呈现旧方法。

你能给我一些提示吗?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    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'
    

    这是您已经拥有的。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看