如何在Django表单中订购ForeignKey关系的结果?

seg*_*aco 14 django django-models django-forms

我在Django中有这个模型

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)
Run Code Online (Sandbox Code Playgroud)

和这个ModelForm

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person
Run Code Online (Sandbox Code Playgroud)

当我在模板中使用此表单时,一切正常,但在国家列表中<select>出现无序.我怎么订购?

Cyr*_* N. 21

您可以使用订购属性:

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

    class Meta:
        ordering = ["name"]
Run Code Online (Sandbox Code Playgroud)

如果将排序设置为Country类,则应根据需要显示它们.

  • 我不认为这是一个正确的解决方案,因为这会强制对模型的所有查询进行排序.一个原因是,即使不需要,也会对此模型上的所有查询进行排序.第二个原因是,如果有两种形式对排序有不同的要求,它就无法解决问题. (4认同)
  • 重要的是你有一个解决你的问题:) (2认同)

die*_*us9 9

如果您不能或不想在模型的Meta类中使用排序属性,您也可以这样做:

你需要创建一个Form对象,例如:

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

表单模型的字段类型


Tim*_*all 7

这里有2个很好的答案,但我想保留help_text,blank并从模型中的其他设置,而无需赘述,也不会改变模型上的默认排序.这是我做的:

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')
Run Code Online (Sandbox Code Playgroud)

基本上我只是在自动添加的字段上更新了查询集,以便按照我想要的方式进行排序.