Vous n'êtes pas identifié(e).
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
Totalement de mémoire je crois que la solution est par là : https://docs.djangoproject.com/en/dev/ref/models/options/#ordering
Hors ligne
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
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
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
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
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
Je suis encore novice en python, tu peux m'expliquer le paragraphe avec le def __init__ ?
Hors ligne
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
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
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