Django小部件覆盖临时

2024-05-03 09:04:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚到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)

小工具.py:

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

项目/widgets/filter.html:

 <h1>TEST</h1>

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

你能给我一些提示吗?


Tags: djangonamepytestprojecthtmltemplateforms
3条回答

似乎您正在尝试使用仅在Django 1.11中可用的template-based widget form rendering API,而您应该升级到Django 1.11或使用旧方法,即overriding the render() method

要呈现新的小部件模板,必须执行以下步骤:

1)将“django.forms”添加到已安装的应用程序中

2)将FORM_RENDERER='django.forms.renderers.TemplatesSetting'添加到settings.py中。

更多详细信息:https://docs.djangoproject.com/en/2.0/ref/forms/renderers/#django.forms.renderers.TemplatesSetting

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版:

renderer's documentation中,我们可以找到以下内容:

New in Django 1.11:

In older versions, widgets are rendered using Python. All APIs described in this document are new.

通过查看widget source code,特别是Input小部件如何扩展Widget类,我们可以看到您只需要按如下方式自定义小部件:

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

这就是你已经拥有的。

相关问题 更多 >