Plantilla de anulación de widget Django

Soy nuevo en Django.

Quiero crear un widget personalizado.

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' 

proyecto / widgets / filter.html:

  

TEST

Pero no renderiza la nueva plantilla, en su lugar, sigue representando la forma antigua.

¿Me puede dar algunos consejos?

Versión Django <1.11:

El widget debe implementar el método de render para representar una plantilla diferente:

 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 versión 1.11:

En la documentación del renderizador , podemos encontrar lo siguiente:

Nuevo en Django 1.11:

En versiones anteriores, los widgets se representan utilizando Python. Todas las API descritas en este documento son nuevas.

Y al observar el código fuente del widget y, específicamente, sobre cómo el widget de Input amplía la clase de Widget , podemos ver que solo necesita personalizar su widget de la siguiente manera:

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

Que es lo que ya tienes.

Deberá realizar los pasos a continuación para representar su nueva plantilla de widget:

1) Agregue ‘django.forms’ a su INSTALLED_APPS ;

2) Agregue FORM_RENDERER = ‘django.forms.renderers.TemplatesSetting’ a su settings.py .

Más detalles: https://docs.djangoproject.com/en/2.0/ref/forms/renderers/#django.forms.renderers.TemplatesSetting

Parece que está tratando de usar la API de representación de formularios de widgets basados ​​en plantillas que está disponible solo en Django 1.11, o debería actualizar a Django 1.11 o usar la forma anterior, que está anulando el método render ()