Django widget override template

django, python, widget

Solution

Django version < 1.11:

The widget must implement the `render` method in order to render a different template:

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 version 1.11:

In the renderer's documentation, we can find the following:

New in Django 1.11:

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

And by having a look at the widget source code and specifically on how the `Input` widget extends the `Widget` class, we can see that you would only need to customize your widget as follows:

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

Which is what you have already.

Problem

I am new at django. I want to create a custom widget. 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> ``` But it doesn't render the new template, instead it still renders the old way. Can you give me some tips?

Original source