Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Django表单中排序ForeignKey关系的结果?_Django_Django Models_Django Forms - Fatal编程技术网

如何在Django表单中排序ForeignKey关系的结果?

如何在Django表单中排序ForeignKey关系的结果?,django,django-models,django-forms,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) co

我在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)
这个模型呢

class PersonForm(forms.ModelForm):

    class Meta:
        model = Person

当我在模板中使用此表单时,一切正常,但
中的国家/地区列表显得杂乱无章。我如何订购它?

尝试将其添加到类元、类内人员:

ordering = ['country']

您可以使用以下属性:

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

    class Meta:
        ordering = ["name"]

如果您将订购设置为国家/地区类别,它将根据您的需要显示它们。

如果您不能或不想使用Meta model类别中的订购属性,您也可以这样做:

您需要创建一个表单对象,类似于:

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

这里有两个很好的答案,但我想保留模型中的
帮助\u文本
空白
,以及其他设置,而不必重复它们,也不必更改模型上的默认顺序。以下是我所做的:

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')

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

感谢您无缘无故地否决了我的投票!我同意@cx42net。如果我们的答案对你不好,那就解释一下你自己,用一种我们能真正帮助你的方式。我不确定,但也许回答我问题的另一个人会先投票给你让他回答。也许我错了。重要的是你找到了问题的解决方案:)我认为这不是一个正确的解决方案,因为这迫使对模型的所有查询排序。一个原因是,即使不需要,也会对该模型上的所有查询进行排序。第二个原因是,如果有两种对订购有不同要求的表单,则无法解决问题。这将按国家id排序,而不是按国家名称排序。