2010-10-20 85 views
0

我有我正在使用在以下領域的形式。Django的形式查詢集爲ModelChoiceField

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

的國家模型看起來像這樣

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' ] 

的「特殊」字段指示該國是「特殊的」。如果這個國家是「特殊」的,我希望它能夠出現在列表的其餘部分 - 因爲我相信你在網絡上的其他地方看到過這種情況(例如英語國家,如澳大利亞,英國和美國,位於選擇,但也與其他國家一樣)。

QuerySet可以嗎?或者我應該尋找其他地方?

回答

2

contact_country = forms.ModelChoiceField(queryset=Country.objects.order_by('special'))是否工作?

+0

是的,除此之外,我沒有得到「特殊」的國家再次出現下面列出所有國家的名單。 – Salgo 2010-10-20 13:09:57

+0

最佳答案,但應改爲'.order_by(' - special')'。 – 2012-12-17 17:27:24

0

這是未經測試,你可以給它一個嘗試,但它可能不會給你想要什麼......

在你看來這樣做:

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]) 

你的差點,喲使用列表創建列表,而不是直接從查詢集

這將解決您的pronblem,用髒兮兮的方式,但它是我使用時的ModelForm不能幫你解決......

0

可以覆蓋默認ordering

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

你也可以寫一個custom manager,但它不值得...

相關問題