2017-06-21 4 views
2

Ich bin neu bei Django.Django Widget überschreiben Vorlage

Ich möchte ein benutzerdefiniertes Widget erstellen.

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' 

Projekt/widgets/filter.html:

<h1>TEST</h1> 

Aber es macht nicht die neue Vorlage Stattdessen gibt es immer noch den alten Weg.

Können Sie mir ein paar Tipps geben?

+0

Wie Sie das Widget in Ihrem Formular verwendet haben? –

+0

@DanielRoseman Ich habe meinen Beitrag bearbeiten – Flo

+0

Welche Django-Version verwenden Sie? – SebCorbin

Antwort

5

Django Version < 1.11:

Das Widget implementieren muss die render Methode, um eine andere Vorlage zu machen:

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 die renderer's documentation, können wir folgendes finden:

Neu in Django 1.11:

In älteren Versionen, Widgets Python gemacht verwenden. Alle in diesem Dokument beschriebenen APIs sind neu.

Und durch einen Blick auf die widget source code mit und speziell darauf, wie die Input Widget die Widget-Klasse erweitert, können wir sehen, dass Sie nur Ihr Widget anpassen müsste wie folgt:

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

Welche ist was hast du schon.

+0

Es müsste "return mark_safe (render_to_string (self.template_name))" sein, wenn ich mich nicht irre. – jhrr

+1

Wahr, dass @ Jhrr, ich werde es beheben. –