我在Django中有一个Model,下面的示例代码(不是我的实际代码):
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
假设我在Django shell中执行以下操作:
>>> 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
,那么Departments会出现在一个下拉框(HTML选择框)中。到目前为止一切都很好。
问题是:选择框中的项目按ID排序。因此它们显示为:
但是,我希望它们按字母顺序排序,即
如何在ModelForm
代码或Model
代码中更改这些项目的排序方式,而不是在模板中?
一般来说,如何在ModelForm
生成时自定义特定字段或窗口小部件的工作方式?
答案 0 :(得分:9)
如何在ModelForm代码或Model代码中更改这些项的排序方式,而不是在模板中?
您可以做的一件事是添加ordering
meta option。您可以通过向类添加Meta
内部类来执行此操作,并指定ordering
属性:
class Department(models.Model):
name = models.CharField(max_length=100)
abbreviation = models.CharField(max_length=4)
class Meta:
ordering = ["name"]
请注意,这会更改Department
模型的默认排序(不仅仅是在表单中使用时)。
通常,如何在ModelForm生成时自定义特定字段或窗口小部件的工作方式?
您需要阅读有关ModelForm
和built-in form fields的Django文档。特别是,请注意可选的widget
属性,该属性允许您更改表单字段的小部件。小部件的不同类型描述为here。
答案 1 :(得分:1)
mipadi向您展示了如何修改Department模型的排序,这反映在表单小部件中。
但是,如果您只想更改该窗口小部件的顺序,并将模型的默认顺序保留为其他内容,则可以执行以下操作:
class CourseForm(ModelForm):
department = forms.ModelChoiceField(
queryset=Department.objects.order_by('name'))
class Meta:
model = Course