2009-08-14 56 views
6

我有在Django模型,下面的示例代碼(不是我的實際代碼):控制的Django的ModelForm輸出

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:如果我剛好referncing變量直接渲染ModelForm對象在模板

class Course(models.Model): 
    department = models.ForeignKey('Department') 
    number = models.IntegerField() 

class CourseForm(ModelForm): 
    class Meta: 
     model = Course 

,說form,這得到了傳下來,各部門出現在下拉框(一個HTML選擇框)。到現在爲止還挺好。

問題是:選擇框中的項目按ID排序。因此,他們的出現:

  1. 計算機科學
  2. 數學
  3. 人類學

但是,我想他們按字母順序排序,即

  1. 人類學
  2. 計算機科學
  3. 數學

我如何改變這些項目在t中的排序方式他ModelForm代碼,或者在Model代碼中,而不是在模板中?

而且一般情況下,如何在由ModelForm生成特定字段或小部件時自定義方式?

回答

9

如何更改這些項目在ModelForm代碼或模型代碼中而不是模板中的排序方式?

你可以做的一件事是添加一個orderingmeta 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

+0

謝謝!這確實是我在找的東西。 – 2009-08-17 18:03:15

+0

哇 - 很好的答案! – sage 2014-01-11 22:31:54

1

mipadi向您展示瞭如何修改您的部門模型的排序,這反映在表單部件中。

但是,如果你只是想改變順序爲小部件,並保留模型的默認排序爲別的東西,你可以這樣做:

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

    class Meta: 
     model = Course