【问题标题】:Controlling Django ModelForm output控制 Django ModelForm 输出
【发布时间】:2010-11-19 17:40:35
【问题描述】:

我在 Django 中有一个模型,下面的示例代码(不是我的实际代码):

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

如果我通过引用一个变量(例如 form)直接在模板中呈现 ModelForm 对象,该变量已被传递下来,则部门会出现在下拉框(HTML 选择框)中。到目前为止一切顺利。

问题是:选择框中的项目是按ID排序的。所以它们显示为:

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

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

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

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

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

【问题讨论】:

    标签: python django django-templates django-forms


    【解决方案1】:

    如何更改这些项目在 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

    【讨论】:

    • 谢谢!这正是我想要的。
    【解决方案2】:

    mipadi 向您展示了如何修改 Department 模型的排序,这反映在表单小部件中。

    但是,如果您只想更改该小部件的顺序,并将模型的默认顺序保留为其他内容,您可以这样做:

    class CourseForm(ModelForm):
        department = forms.ModelChoiceField(
                               queryset=Department.objects.order_by('name'))
    
        class Meta:
            model = Course
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 2010-12-15
      • 2019-03-11
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 2013-12-17
      相关资源
      最近更新 更多