简体   繁体   English

django admin 排序外键字段列表

[英]django admin sort foreign key field list

Is there an option in the django admin view for ordering of foreign key fields? django 管理视图中是否有用于排序外键字段的选项? ie I have a foreign key to a "School" model, which shows as a dropdown, sorted on pk-- I would like it to be sorted alphabetically.即我有一个“学校”模型的外键,它显示为一个下拉列表,按 pk 排序——我希望它按字母顺序排序。

Sure - you can...你当然可以...

ModelAdmin specific method: (the other methods are in my answer in the post linked to above) 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(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

Examples for the other 3 non admin specific methods in my post linked above.我在上面链接的帖子中的其他 3 种非管理员特定方法的示例。

It seems to work to add an admin class to the model admin, with the ordering equal to the field you want the drop down list sorted by.似乎可以向模型管理员添加一个管理类,其顺序等于您希望下拉列表排序的字段。

# in the admin.py file

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

admin.site.register(SchoolModel, SchoolAdmin)

This works if you are willing to have an edit/add option next to drop down list.如果您愿意在下拉列表旁边有一个编辑/添加选项,这将起作用。

The approved answer might override other changes on the queryset, so I prefer to use this because it's safer:批准的答案可能会覆盖查询集上的其他更改,所以我更喜欢使用它,因为它更安全:

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

You can override formfield_for_foreignkey() to change order as shown below:您可以覆盖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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM