2010-10-20 75 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,但它不值得...