【问题标题】:Django form QuerySet for ModelChoiceFieldModelChoiceField 的 Django 表单查询集
【发布时间】:2010-10-20 12:58:11
【问题描述】:

我有一个表单,我在其中使用以下字段。

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 有可能吗?还是应该去别处看看?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

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

    【讨论】:

    • 是的,除此之外,我没有在所有国家/地区列表中再次出现“特殊”国家/地区。
    • 最佳答案,但应改为.order_by('-special')
    【解决方案2】:

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

    在你看来这样做:

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

    您的障碍是,您使用列表而不是直接从查询集创建列表

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

    【讨论】:

      【解决方案3】:

      您可以覆盖默认的ordering

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

      你也可以写custom manager,但这不值得……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-15
        • 2011-07-13
        • 2013-03-14
        • 1970-01-01
        • 2011-12-31
        • 2011-08-17
        • 2013-03-14
        • 1970-01-01
        相关资源
        最近更新 更多