web-dev-qa-db-fra.com

Modèle de remplacement de widget Django

Je suis nouveau à Django. 

Je veux créer un widget personnalisé. 

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>

Mais il ne restitue pas le nouveau modèle, il restitue toujours l'ancien. 

Pouvez-vous me donner des conseils?

8
Flo

Django version <1.11:

Le widget doit implémenter la méthode render pour générer un modèle différent:

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:

Dans la documentation du moteur de rendu , nous pouvons trouver ce qui suit:

Nouveau dans Django 1.11:

Dans les versions antérieures, les widgets sont rendus à l'aide de Python. Toutes les API décrites dans ce document sont nouvelles.

Et en jetant un coup d'œil au code source du widget et plus précisément à la manière dont le widget Input étend la classe Widget, vous constaterez qu'il vous suffira de personnaliser votre widget comme suit:

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

C'est ce que tu as déjà.

13
John Moutafis

Vous devrez suivre les étapes ci-dessous pour rendre votre nouveau modèle de widget:

1) Ajoutez 'Django.forms' à votre INSTALLED_APPS;

2) Ajoutez FORM_RENDERER = 'Django.forms.renderers.TemplatesSetting' à votre settings.py.

Plus de détails: https://docs.djangoproject.com/fr/2.0/ref/forms/renderers/#Django.forms.renderers.TemplatesSetting

6
Milan

Il semble que vous essayiez d'utiliser l'API de rendu de formulaire de widget basé sur template , disponible uniquement dans Django 1.11. Vous devez également passer à Django 1.11 ou utiliser l'ancienne méthode, à savoir surcharger la méthode render ()

0
SebCorbin