我的models.py
class Business(models.Model):
industry = models.models.ManyToManyField(Industry)
在forms.py
中class BusinessForm(forms.ModelForm):
class Meta:
model = Business
当我渲染表单时,行业名称会出现在多个选择框中。如何按字母顺序排列行业名称?
答案 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来更改订单。