控制Django ModelForm输出
我在Django里有一个模型,下面是示例代码(不是我的实际代码):
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
假设我在Django的命令行工具里做了以下操作:
>>> Department(name='Computer Science',abbreviation='C S ').save()
>>> Department(name='Mathematics',abbreviation='MATH').save()
>>> Department(name='Anthropology',abbreviation='ANTH').save()
现在我在数据库里存储了这四个部门。假设我们还有一个类,叫做Course
,它属于一个Department
:
class Course(models.Model):
department = models.ForeignKey('Department')
number = models.IntegerField()
class CourseForm(ModelForm):
class Meta:
model = Course
如果我直接在模板里渲染这个ModelForm
对象,只需引用一个变量,比如form
,这个变量是传递下来的,那么部门就会出现在一个下拉框里(就是HTML的选择框)。到这里一切正常。
问题是:下拉框里的项目是按ID排序的。所以它们的显示顺序是:
- 计算机科学
- 数学
- 人类学
但我想要的是按字母顺序排序,也就是:
- 人类学
- 计算机科学
- 数学
我该如何在ModelForm
代码中,或者在Model
代码中改变这些项目的排序方式,而不是在模板里?
总的来说,我该如何自定义在生成ModelForm
时,某个特定字段或小部件的工作方式?
2 个回答
1
mipadi已经向你展示了如何修改你的部门模型的排序,这个排序在表单小部件中得到了体现。
不过,如果你只是想改变这个小部件的排序,而不想改变模型的默认排序,你可以这样做:
class CourseForm(ModelForm):
department = forms.ModelChoiceField(
queryset=Department.objects.order_by('name'))
class Meta:
model = Course
9
我怎么能在ModelForm代码或者Model代码中改变这些项目的排序方式,而不是在模板里呢?
你可以做的一件事是添加一个 ordering
meta选项。具体来说,你可以在一个类里面添加一个 Meta
内部类,并指定 ordering
属性:
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
class Meta:
ordering = ["name"]
注意,这样做会改变 Department
模型的默认排序(不仅仅是在表单中使用时)。
那么一般来说,我怎么能自定义在ModelForm生成时某个特定字段或小部件的工作方式呢?
你需要查看Django文档中关于 ModelForm
和 内置表单字段 的内容。特别是,要注意可选的 widget
属性,它允许你改变表单字段的小部件。不同类型的小部件可以在 这里 找到详细描述。