Python ModelChoiceField的Django表单查询集

Python ModelChoiceField的Django表单查询集,python,django,django-forms,Python,Django,Django Forms,我有一个表单,我正在使用下面的字段 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.CharFiel

我有一个表单,我正在使用下面的字段

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来说这可能吗?或者我应该去别的地方看看吗?

确实
联系\u country=forms.modelcoocefield(queryset=country.objects.order\u by('special'))
工作吗?

这是未经测试的,所以您可以尝试一下,但它可能无法满足您的需求

在您看来,请执行以下操作:

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无法帮助您时使用的解决方案…

您可以覆盖默认设置:


你也可以写一个,但不值得…

是的,除此之外,我没有看到“特殊”国家再次出现在下面所有国家的列表中。最好的答案应该是
。order\u by('-special')
class Meta:
    ordering = [ '-special', 'printable_name' ]