模型形式ManytoManyField DJANGO中的订购选项

模型形式ManytoManyField DJANGO中的订购选项,django,django-models,django-forms,Django,Django Models,Django Forms,我的模型里有 class Business(models.Model): industry = models.models.ManyToManyField(Industry) 在forms.py中 class BusinessForm(forms.ModelForm): class Meta: model = Business 渲染表单时,行业名称显示在多个选择框中。如何按字母顺序排列行业名称?有几种方法: 您可以基于每个表单覆盖queryset排序,设置ord

我的模型里有

class Business(models.Model):
   industry = models.models.ManyToManyField(Industry)
在forms.py中

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

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

有几种方法:

您可以基于每个表单覆盖queryset排序,设置ordering meta class选项,或者使用排序方法覆盖model manager queryset

覆盖全局模型管理器查询集 指定全局元选项排序 按表格订购 如果您与django管理员打交道,还有一个名为formfield的快捷方式,可供许多人使用。

我喜欢这种方法:

class BusinessForm(forms.ModelForm):

    class Meta:
        model = Business

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

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

回答得很好,非常感谢!我还尝试重写all()方法,但没有成功。我使用覆盖get\u query\u set。就像一个符咒:)覆盖什么
all()
方法?我认为除了模特经理之外,没有一个是存在的。非常感谢你!这让我有一段时间很沮丧,我想补充一点,直接从字段本身获取queryset可能更合适:self.fields['industry'].queryset.order_by('name')。(假设它涉及关系字段)否则,您复制了通过此字段编辑的关系类。
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')
class BusinessForm(forms.ModelForm):

    class Meta:
        model = Business

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