控制Django ModelForm输出

6 投票
2 回答
1935 浏览
提问于 2025-04-15 13:36

我在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排序的。所以它们的显示顺序是:

  1. 计算机科学
  2. 数学
  3. 人类学

但我想要的是按字母顺序排序,也就是:

  1. 人类学
  2. 计算机科学
  3. 数学

我该如何在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 属性,它允许你改变表单字段的小部件。不同类型的小部件可以在 这里 找到详细描述。

撰写回答