2009-03-11 11 views
2

Je voudrais ma forme à quelque chose de sortie comme ceci:Insertion d'une rubrique dans un formulaire Django

Name: ___________ 
Company: ___________ 

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

Ce qui veut dire, je voudrais avoir le « intéressé » titre inséré au milieu de ma sortie de formulaire. Une façon de procéder consiste à écrire le code du gabarit pour chaque champ et à insérer le titre approprié. Cependant, je préférerais ne pas le faire. Je soupçonne qu'il y a quelque chose à faire avec des formsets qui feront ce que je veux.

Y a-t-il un moyen de faire ce que je veux, ou ai-je juste besoin de le sucer et d'accepter que j'ai besoin d'écrire mon template pour cela?

Répondre

3

Avec FieldsetMixin vous obtenez des ensembles de champs de type Admin. 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 
3

Django formsets ne sont pas la voie à suivre: Ils sont utilisés si vous avez besoin d'éditer plusieurs objets en même temps. Fieldsets HTML sont plus comme la bonne façon. J'imagine que vous pouvez regrouper les champs de nom et d'entreprise en un seul domaine, puis les champs d'intérêt en un autre.

Sur DjangoSnippets vous pouvez trouver un template tag that aids the grouping.

En utilisant cet extrait, vous définiriez le regroupement dans votre point de vue

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

passe au modèle ainsi que la forme, et de rendre la forme que je préférerais pas

{% draw_form form fieldsets %} 

pour définir le groupement dans la vue, car c'est principalement une question de présentation et devrait appartenir à la vue, mais que diable, cela semble faire le travail!

muhuk solution de mais ressemble plus élégant que cela ...

+0

Bookmarked the link. Je verrai plus tard. Merci d'avoir partagé. – muhuk

+0

Je pense qu'il appartient à la forme parce que les champs foo, bar et baz sont liés conceptuellement, je ne veux pas seulement insérer un en-tête pour le rendre meilleur. De toute façon, je vais regarder ces solutions une fois que j'ai pris mon café du matin. :) –

0

Il est un peu un hack, mais vous pouvez définir une HeaderWidget qui vient rend 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) 

et puis ajoutez un champ à l'emplacement désiré 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 obtiendrez l'en-tête "valeur e "posté avec votre formulaire.

Questions connexes