3 votes

Insertion d'un en-tête dans un formulaire Django

Je voudrais que mon formulaire produise quelque chose comme ceci :

Name: ___________
Company: ___________

Interested in
-------------
Foo: [ ]
Bar: [ ]
Baz: [ ]

En d'autres termes, je voudrais que le titre "Intéressé par" soit inséré au milieu de la sortie de mon formulaire.

Une façon de procéder serait d'écrire le code du modèle pour chaque champ, et d'insérer l'en-tête comme il convient. Cependant, je préférerais ne pas le faire. Je soupçonne qu'il y a quelque chose à faire avec les jeux de formulaires qui fera ce que je veux.

Est Y a-t-il un moyen de faire ce que je veux, ou dois-je me résigner et accepter que je doive écrire mon modèle à la main ?

3voto

Guðmundur H Points 3323

Les jeux de formulaires de Django ne sont pas la solution : Ils sont utilisés si vous devez modifier plusieurs objets en même temps. Les jeux de champs HTML sont plutôt la bonne solution. J'imagine que vous pourriez regrouper les champs de nom et de société dans un jeu de champs, puis les champs d'intérêt dans un autre.

Sur DjangoSnippets, vous pouvez trouver une balise de modèle qui facilite le regroupement .

En utilisant cet extrait, vous définissez le regroupement dans votre vue comme suit

fieldsets = (
    ('', {'fields': ('name','company')}),
    ('Interested in', {'fields': ('foo','bar','baz')})
)

Passez-le au modèle avec le formulaire, et rendez le formulaire avec

{% draw_form form fieldsets %}

Je préférerais ne pas définir le regroupement dans la vue, car il s'agit principalement d'une question de présentation qui devrait appartenir à la vue, mais que diable, cela semble faire l'affaire !

muhuk La solution de l'auteur est cependant plus élégante que celle-ci...

2voto

muhuk Points 6526

Avec FieldsetMixin vous obtenez des champs de type administrateur. Vous créez votre formulaire comme ceci :

from django.forms import Form
from formfieldset.forms import FieldsetMixin

class MyForm(Form, FieldsetMixin):
    fieldsets = (
        (u'', {'fields': ['name', 'company']}),
        (u'Interested in', {'fields': ['foo', 'bar', 'baz']}),
    )

    # rest of the form

1voto

Rick Mohr Points 478

C'est un peu une pirouette, mais vous pourriez définir un fichier HeaderWidget qui ne fait que rendre sa valeur :

from django.forms.util import flatatt
from django.utils.html import format_html

class HeaderWidget(forms.widgets.Widget):
    def render(self, name, value, attrs=None):
        attrs.update(self.attrs)
        return format_html('<div{0}>{1}</div>', flatatt(attrs), value)

puis ajoutez un champ à l'endroit souhaité en utilisant ce widget :

header = forms.CharField(
    widget=HeaderWidget(attrs={'class': 'my-css-class'}),
    initial='Interested in',
    required=False,
    label='')

Un inconvénient mineur est que vous aurez l'en-tête "valeur" affiché avec votre formulaire.

0voto

Vasil Points 11172

Les champs du formulaire conservent l'ordre dans lequel vous avez défini la classe de formulaire ou le modèle s'il s'agit d'un formulaire pour modèle. Dans le modèle, vous pouvez itérer à travers tous les champs en spécifiant la façon dont ils sont rendus, vous pouvez vérifier celui que vous recherchez avec la balise ifequal et spécifier le rendu différent.

Voir :

http://docs.djangoproject.com/en/dev/topics/forms/?from=olddocs#looping-over-the-form-s-fields

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