在ModelForm ManytoManyField DJANGO中订购选择

时间:2011-06-30 21:47:28

标签: django django-models django-forms

我的models.py

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

在forms.py

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

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

3 个答案:

答案 0 :(得分:65)

有几种方法:

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

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

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的快捷方式。

答案 1 :(得分:1)

我喜欢这种方法:

class BusinessForm(forms.ModelForm):

    class Meta:
        model = Business

    industry = forms.ModelMultipleChoiceField(
               queryset=Industry.objects.order_by('name'))

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

答案 2 :(得分:0)

当它指向this answer时,您需要使用through来更改订单。