django admin sort foreign key field list

后端 未结 3 1745
北海茫月
北海茫月 2021-01-30 17:12

Is there an option in the django admin view for ordering of foreign key fields? i.e. I have a foreign key to a \"School\" model, which shows as a dropdown, sorted on pk-- I woul

相关标签:
3条回答
  • 2021-01-30 17:25

    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
    
    0 讨论(0)
  • 2021-01-30 17:31

    Sure - you can...

    • ModelAdmin specific ordering via formfield_for_foreignkey
    • Set default global ordering via a Manager
    • Set default ordering via model meta class
    • Form specific ordering then passed to your ModelAdmin

    ModelAdmin specific method: (the other methods are in my answer in the post linked to above)

    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.

    0 讨论(0)
  • 2021-01-30 17:47

    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.

    0 讨论(0)
提交回复
热议问题