【问题标题】:Ordering Choices in ModelForm ManytoManyField DJANGOModelForm ManytoManyField 中的排序选择 DJANGO
【发布时间】:2011-09-26 08:32:21
【问题描述】:

我的models.py中有

class Business(models.Model):
   industry = models.models.ManyToManyField(Industry)

在forms.py中

class BusinessForm(forms.ModelForm):
    class Meta:
        model = Business

当我呈现表单时,行业名称出现在多选框中。如何按字母顺序排列行业名称?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    有几种方法:

    您可以基于每个表单覆盖查询集排序,设置排序元类选项,或使用排序方法覆盖模型管理器查询集。

    覆盖全局模型管理器查询集

    class IndustryManager(models.Manager):
        def get_query_set(self):
            return (
                super(IndustryManager, self)
                .get_query_set()
                .order_by('name')
            )
    
    class Industry(models.Model):
        name = models.CharField(max_length=128)
        objects = IndustryManager()
    

    指定全局元选项排序

    class Industry(models.Model):
        name = models.CharField(max_length=128)
    
        class Meta:
            ordering = ['name']
    

    进行表格订购

    class MyForm(forms.ModelForm):
        class Meta:
            model = Business
    
        def __init__(self, *args, **kwargs):
            super(MyForm, self).__init__(*args, **kwargs)   
            self.fields['industry'].queryset = Industry.objects.order_by('name')
    

    如果您正在与 django 管理员打交道,还有一个名为 formfield_for_manytomany 的快捷方式。

    【讨论】:

    • 很好的答案,非常感谢!我也尝试过覆盖 all() 方法,但没有奏效。我选择了覆盖 get_query_set。像魅力一样工作:)
    • 覆盖什么all() 方法?我认为在模型管理器之外不存在。
    • 非常感谢!这让我沮丧了一段时间
    • 我想补充一点,直接从字段本身获取查询集可能更合适:self.fields['industry'].queryset.order_by('name')。 (鉴于它涉及关系字段)否则,您复制了通过该字段编辑的关系类。
    【解决方案2】:

    我喜欢这种方法:

    class BusinessForm(forms.ModelForm):
    
        class Meta:
            model = Business
    
        industry = forms.ModelMultipleChoiceField(
                   queryset=Industry.objects.order_by('name'))
    

    我喜欢它,因为它不会改变数据库模型,而且它是声明性的(更少的编程)。

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 2018-01-11
      • 1970-01-01
      • 2018-11-23
      • 2017-07-21
      • 2020-11-15
      • 2012-01-31
      • 2015-09-24
      • 2015-08-11
      相关资源
      最近更新 更多