Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Trier les données d'un formulaire générées avec un ModelForm

#1 24-05-2012 11:54:17

Songohan
Membre
Lieu : Rhône (69)
Inscription : 24-05-2012
Messages : 6

Trier les données d'un formulaire générées avec un ModelForm

Bonjour, j'ai créé un formulaire à partir d'un model (un ModelForm).
Le formulaire affiche des listes déroulantes. J'aimerais que le contenu des listes déroulantes soit triè par ordre alphabétique.

Voici le code concerné :

class Deal(models.Model):
    category = models.ForeignKey(Category,to_field='title', verbose_name="Catégorie")
    peer = models.ForeignKey(Peer, to_field='name', verbose_name="Magasin")
    amount = models.DecimalField('Montant', max_digits=8, decimal_places=2)
    date = models.DateField('Date de la transaction')
    desc = models.CharField('Description de l\'achat', max_length=20, blank=True)

class DealForm(ModelForm):
    class Meta:
        model = Deal


Par exemple, pour le champs Peer, j'ai :

<label for="id_peer">Magasin</label>:<select name="peer" id="id_peer">
<option value="" selected="selected">---------</option>
<option value="Géant Casino">Géant Casino</option>
<option value="Auchan">Auchan</option>
<option value="Simply Market">Simply Market</option>
<option value="Carrefour Market">Carrefour Market</option>
<option value="Les Halles de Villefranche">Les Halles de Villefranche</option>
<option value="Agip">Agip</option>
</select>

Je voudrais avoir :

<label for="id_peer">Magasin</label>:<select name="peer" id="id_peer">
<option value="" selected="selected">---------</option>
<option value="Agip">Agip</option>
<option value="Auchan">Auchan</option>
<option value="Carrefour Market">Carrefour Market</option>
<option value="Géant Casino">Géant Casino</option>
<option value="Les Halles de Villefranche">Les Halles de Villefranche</option>
<option value="Simply Market">Simply Market</option>
</select>

Savez-vous comment faire ?

Hors ligne

#2 24-05-2012 12:17:43

Vincent
Membre
Inscription : 08-08-2011
Messages : 20

Re : Trier les données d'un formulaire générées avec un ModelForm

Totalement de mémoire je crois que la solution est par là : https://docs.djangoproject.com/en/dev/ref/models/options/#ordering

Hors ligne

#3 24-05-2012 12:34:00

Songohan
Membre
Lieu : Rhône (69)
Inscription : 24-05-2012
Messages : 6

Re : Trier les données d'un formulaire générées avec un ModelForm

J'ai mis ça, mais ça ne change rien.

class DealForm(ModelForm):
  class Meta:
    model = Deal
    ordering = ['-category', '-peer']

Je veux que les 2 listes déroulantes (category et peer) soient triées.

Pour info, dans mon template, j'ai :
<form method="post" action="{% url index %}">
  {% csrf_token %}
  {% for field in data.form %}
    {% if field.errors %}
      {{ field.label_tag }} : {{ field.errors }}
    {% endif %}
  {% endfor %}

  {% for field in data.form %}
    {{ field.label_tag }}:{{ field }}
  {% endfor %}
  <input type="submit" value="Ajouter">
</form>

Dernière modification par Songohan (24-05-2012 12:41:52)

Hors ligne

#4 24-05-2012 12:43:19

Vincent
Membre
Inscription : 08-08-2011
Messages : 20

Re : Trier les données d'un formulaire générées avec un ModelForm

Il faut que tu le précise dans ton model et je crois qu'après ça suit tout seul.

Je suis en pause j'ai pas d'ordi sous les yeux donc je ne peux pas aider plus que ça désolé ^^"

Hors ligne

#5 24-05-2012 13:00:00

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Trier les données d'un formulaire générées avec un ModelForm

Salut,

Si c'est sur le formulaire de ton modèle dans l'admin Django c'est la solution
de l'attribut "Meta.ordering" à renseigner.

Si c'est dans un formulaire hors de l'admin, ça se passe avec un
"ModelChoiceField" avec lequel tu peux définir une option "queryset" définissant
le queryset à employer et donc où tu peux définir l'ordre (et plus si besoin).

Je crois que si tu l'a pas définit à la main dans ton formulaire, Django doit
l'utiliser automatiquement, si c'est le cas tu doit pouvoir surcharger
l'attribut queryset comme ceci :

class DealForm(ModelForm):
    def __init__(self, *arg, **kwargs):
        super(DealForm, self).__init__(*args, **kwargs)
    self.fields['peer'].queryset = Peer.objects.all().order('-category', '-
peer')

Sinon essaye aussi de spécifier carrément ce champ "ModelChoiceField" à la
main.

Hors ligne

#6 24-05-2012 17:07:07

Songohan
Membre
Lieu : Rhône (69)
Inscription : 24-05-2012
Messages : 6

Re : Trier les données d'un formulaire générées avec un ModelForm

J'ai réussi :

Voici ce que j'ai mis :

class DealForm(ModelForm):
  category = forms.ModelChoiceField(queryset=Category.objects.all().order_by('title'))
  peer = forms.ModelChoiceField(queryset=Peer.objects.all().order_by('name'))
  class Meta:
    model = Deal

-------------------------------

Que pensez-vous de ce code ?

Hors ligne

#7 24-05-2012 17:11:15

Songohan
Membre
Lieu : Rhône (69)
Inscription : 24-05-2012
Messages : 6

Re : Trier les données d'un formulaire générées avec un ModelForm

David Thenon a écrit :

Salut,

Si c'est sur le formulaire de ton modèle dans l'admin Django c'est la solution
de l'attribut "Meta.ordering" à renseigner.

Si c'est dans un formulaire hors de l'admin, ça se passe avec un
"ModelChoiceField" avec lequel tu peux définir une option "queryset" définissant
le queryset à employer et donc où tu peux définir l'ordre (et plus si besoin).

Je crois que si tu l'a pas définit à la main dans ton formulaire, Django doit
l'utiliser automatiquement, si c'est le cas tu doit pouvoir surcharger
l'attribut queryset comme ceci :

class DealForm(ModelForm):
    def __init__(self, *arg, **kwargs):
        super(DealForm, self).__init__(*args, **kwargs)
    self.fields['peer'].queryset = Peer.objects.all().order('-category', '-
peer')

Sinon essaye aussi de spécifier carrément ce champ "ModelChoiceField" à la
main.


Le ModelChoiceField marche très bien smile

Je suis encore novice en python, tu peux m'expliquer le paragraphe avec le def __init__ ?

Hors ligne

#8 24-05-2012 17:41:05

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Trier les données d'un formulaire générées avec un ModelForm

C'est pour surcharger l'instanciation de ton ModelForm, la ligne avec le
super() déclenche l'instanciation héritée pour faire tout le process sur les
champs du formulaire, puis la ligne suivante surcharge l'attribut "queryset"
du champ "peer".

Après instanciation d'un formulaire tout ses champs se retrouvent dans le
"self.fields" de ton instance, où tu peux modifier juste certains attributs de
tes champs à la volée sans avoir à carrément les redéfinir.

Je connais un document pas mal à propos des formulaires, par contre je ne le
connais que dans une version pdf :

http://www.slideshare.net/pydanny/advanced-django-forms-usage

Hors ligne

#9 24-05-2012 18:01:59

Songohan
Membre
Lieu : Rhône (69)
Inscription : 24-05-2012
Messages : 6

Re : Trier les données d'un formulaire générées avec un ModelForm

Donc la deuxième méthode serait plus light car je ne redéfinis pas entièrement le champ (field), mais juste son queryset. C'est bien ça ?


Le code suivant marche aussi (pas encore testé avec -ordering):


class DealForm(ModelForm):
  def __init__(self, *args, **kwargs):
    super(DealForm, self).__init__(*args, **kwargs)
    self.fields['peer'].queryset = Peer.objects.all().order_by('name')
    self.fields['category'].queryset = Category.objects.all().order_by('title')
  class Meta:
    model = Deal

Hors ligne

#10 25-05-2012 01:12:48

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Trier les données d'un formulaire générées avec un ModelForm

C'est exactement ça, c'est pas vraiment plus "light" c'est surtout plus "DRY"
(le concept de pas recoder deux fois la même chose) vu que tu ne rédéfinit pas
un champ qui l'a déjà été automatiquement par ton ModelForm.

Hors ligne

  • Accueil
  • » Django-fr
  • » Trier les données d'un formulaire générées avec un ModelForm

Pied de page des forums