2011-05-19 177 views
8

我有這個模型在Django如何在Django表單中訂購ForeignKey關係的結果?

class Country(models.Model): 
    name = models.CharField(max_length=80) 

class Person(models.Model): 
    first_name = models.CharField(max_length=100, db_index=True) 
    last_name = models.CharField(max_length=100, db_index=True) 
    country = models.ForeignKey(Country) 

這的ModelForm

class PersonForm(forms.ModelForm): 

    class Meta: 
     model = Person 

,當我在一個模板中使用這種形式,一切工作正常,但在<select>國家名單出現紊亂。我如何訂購?

回答

15

可以使用ordering屬性,它應該顯示它們,只要你想。

+0

謝謝你沒有理由不投票給我! – 2011-05-19 17:21:22

+0

我同意@ cx42net。如果我們的答案不適合你,只需說明一下,我們可以幫助你 – pavid 2011-05-19 17:24:51

+0

接受-1!這是神奇的<3 – 2011-05-19 17:37:23

7

如果您不能或不想使用模型類元的排序屬性,你也可以這樣做:

你需要做一個表單對象,像:

from django import forms 
class PersonForm(forms.ModelForm): 
    country = forms.ModelChoiceField(queryset=Country.objects.all().order_by('name')) 
    class Meta: 
     model = Person 

field types for formsmodels

3

這裏有2個很好的答案,但我想保留help_textblank,並從模型中的其他設置,而無需贅述,也不會改變模型上的默認排序。以下是我所做的:

class PersonForm(forms.ModelForm): 
    class Meta: 
     model = Person 

    def __init__(self, *args, **kwargs): 
     super(PersonForm, self).__init__(*args, **kwargs) 
     self.fields['country'].queryset = self.fields['country'].queryset.order_by('name') 

本質上,我只是更新了自動添加字段上的queryset,以便按我的意願排序。