Django为ModelChoiceField形成QuerySet

时间:2010-10-20 12:58:11

标签: python django django-forms

我有一张表格,我正在使用以下字段。

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

Country模型看起来像这样

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可以实现吗?或者我应该在别处寻找?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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])

您的障碍是,您可以使用列表创建列表,而不是直接从queryset

创建列表

这将解决你的问题,看起来很脏,但它是我在modelform无法帮助你时使用的解决方案......

答案 2 :(得分:0)

您可以覆盖默认的ordering

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

你也可以写一个custom manager,但它不值得......