2010-10-20 7 views
0

J'ai une forme que je suis en utilisant le champ suivant dans.Django forme QuerySet pour ModelChoiceField

contact_country = forms.ModelChoiceField(queryset=Country.objects.all()) 

Le modèle pays ressemble à ce

class Country(models.Model): 
    iso = models.CharField(max_length=2) 
    name = models.CharField(max_length=80) 
    printable_name = models.CharField(max_length=80) 
    iso3 = models.CharField(max_length=3,null=True, blank=True) 
    numcode = models.IntegerField(null=True, blank=True) 
    special = models.BooleanField(default=False) 

    def __unicode__(self): 
     return self.printable_name 

    class Meta: 
     ordering = [ 'printable_name' ] 

Le champ « spécial » indique que le pays est "spécial". Si le pays est «spécial», je veux qu'il apparaisse avant le reste de la liste - comme je suis sûr que vous avez vu ailleurs sur le web (par exemple, les pays anglophones comme l'Australie, le Royaume-Uni et les États-Unis en haut du sélectionnez, mais aussi avec le reste des pays).

Est-ce possible avec QuerySet? Ou devrais-je regarder ailleurs?

Répondre

2

Est-ce que contact_country = forms.ModelChoiceField(queryset=Country.objects.order_by('special')) fonctionne?

+0

Oui, à part que je ne reçois pas les pays « spéciaux » apparaît à nouveau ci-dessous dans la liste de tous les pays. – Salgo

+0

Meilleure réponse, mais devrait être '.order_by ('- special')' à la place. –

0

Ceci est non testé, donc vous pouvez essayer, mais il ne peut pas donner ce que vous voulez ...

à votre avis faire ceci:

specials = Country.objects.filter(special=True) 
all_of = Country.objects.all() 

# worst thing is, this is a list, not a queryset... 
new_list = list(specials)+list(all_of) 

# add new object to you form... 
YourForm.base_fields['contact_country'] = forms.ChoiceField(choices=[(x.id,x) for x in new_list]) 

Votre handicap est, yo créer la liste à l'aide d'une liste, pas directement de queryset

Cela résoudra votre pronblem, avec une façon sale à la recherche, mais il est une solution i utilisé lorsque ModelForm ne peut pas vous aider ...

0

Vous pouvez remplacer la valeur par défaut ordering:

class Meta: 
    ordering = [ '-special', 'printable_name' ] 

Vous pouvez également écrire un custom manager mais il ne vaut pas ...

Questions connexes