django admin 对外键字段列表进行排序

问题描述 投票:0回答:4

django 管理视图中是否有用于外键字段排序的选项?即我有一个“School”模型的外键,它显示为下拉列表,按 pk 排序——我希望它按字母顺序排序。

python python-3.x django foreign-keys django-admin
4个回答
79
投票

当然 - 你可以...

  • [ModelAdmin 通过 formfield_for_foreignkey 进行特定排序][4]
  • [通过管理器设置默认全局排序][1]
  • [通过模型元类设置默认排序][2]
  • [形成特定顺序,然后传递给您的模型管理员][3]

ModelAdmin具体方法:(其他方法在上面链接的帖子中我的回答中)

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "school":
            kwargs["queryset"] = School.objects.order_by('name')
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

上面链接的我的帖子中其他 3 个非管理特定方法的示例。 [1]:ModelForm ManytoManyField DJANGO 中的排序选择 [2]:ModelForm ManytoManyField DJANGO 中的排序选择 [3]:ModelForm ManytoManyField DJANGO 中的排序选择 [4]:https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey


8
投票

向模型管理添加一个管理类似乎可行,其顺序等于您希望下拉列表排序的字段。

# in the admin.py file

class SchoolAdmin(admin.ModelAdmin):
    ordering = ['school_name']

admin.site.register(SchoolModel, SchoolAdmin)

如果您愿意在下拉列表旁边有一个编辑/添加选项,则此方法有效。


3
投票

批准的答案可能会覆盖查询集上的其他更改,所以我更喜欢使用它,因为它更安全:

class StudentAdmin(admin.ModelAdmin):
    def get_field_queryset(self, db, db_field, request):
        queryset = super().get_field_queryset(db, db_field, request)
        if db_field.name == 'school':
            queryset = queryset.order_by('name')
        return queryset

3
投票

您可以重写 formfield_for_foreignkey() 来更改顺序,如下所示:

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        formfield = super().formfield_for_foreignkey(db_field, request, **kwargs)
        if db_field.name == "school":            
            formfield.queryset = School.objects.order_by('name')
        return formfield
© www.soinside.com 2019 - 2024. All rights reserved.