控制Django ModelForm输出

时间:2009-08-14 17:49:07

标签: python django django-templates django-forms

我在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排序。因此它们显示为:

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

但是,我希望它们按字母顺序排序,即

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

如何在ModelForm代码或Model代码中更改这些项目的排序方式,而不是在模板中?

一般来说,如何在ModelForm生成时自定义特定字段或窗口小部件的工作方式?

2 个答案:

答案 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生成时自定义特定字段或窗口小部件的工作方式?

您需要阅读有关ModelFormbuilt-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