我在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
?生成特定字段或窗口小部件的工作方式?
如何在ModelForm代码或Model代码中更改这些项的排序方式,而不是在模板中?
您可以做的一件事是添加元选项.您可以通过向类添加内部类来执行此操作,并指定属性:ordering
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
属性,它允许您更改表单域的小部件.这里描述了小部件的不同类型.