2 votes

Django échappe au widget lors du rendu du formulaire

J'ai créé un widget personnalisé et un formulaire qui l'utilise. Auparavant, j'avais simplement un modèle simple pour afficher le formulaire lorsque je le déboguais :

    {{ run_form.as_p }}

Maintenant, je veux entourer chaque champ de formulaire d'une balise div, donc j'ai modifié le modèle en :

{% for field in form %}

           {{ field.errors }}
           {{ field.label_tag }}: {{ field }}

{% endfor %}

Mais maintenant il semble que lorsque mon champ est rendu, tous ses caractères sont échappés en HTML, alors maintenant quand je regarde le code source, cela ressemble à <input type="text" id="id_scriptscrap"/> alors qu'il aurait dû être .

Est-ce que j'ai oublié quelque chose? Pourquoi le premier modèle le sort sans échapper, alors que le deuxième échappe? Peut-être ai-je mal fait quelque chose en créant la classe de widget personnalisée?

5voto

Daniel Roseman Points 199743

Peut-être ai-je fait quelque chose de mal en créant la classe de widget personnalisé?

Probablement, bien qu'il soit impossible de dire puisque vous ne postez pas le code.

La raison pour laquelle form.as_p fonctionne est que la méthode form._html_output() - que les différentes méthodes as_foo utilisent - appelle mark_safe sur sa sortie. Cependant, chacune des classes de widget intégrées appelle également mark_safe sur leur propre sortie, c'est pourquoi elles fonctionnent individuellement. Vous devez probablement faire la même chose sur votre widget personnalisé.

0voto

Bartvds Points 406

Cause alternative : cela se produit également si vous avez défini accidentellement votre formulaire avec des widgets au lieu de champs (par exemple password = forms.PasswordInput au lieu de password = forms.CharField(widget=forms.PasswordInput))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X