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?
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))
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à.
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
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 ()