在 Django 中过滤外键查询集 autocomplete_fields

Filter queryset for foreign key in Django autocomplete_fields


class InstitutionProfileAdmin(admin.ModelAdmin):
    def institute_pic_tag(self, obj):
        if obj.institute_pic:
            return format_html('<img src="{}" width="30x"/>'.format(obj.institute_pic.url))

    institute_pic_tag.short_description = 'Instituion Image'

    list_display = ["institute_name", "institute_location",
                    "institute_code", "institute_pic_tag", "owner_name", "owner_email", "active"]

    search_fields = ('user__username', 'institute_name', 'user__email',)
    list_filter = ['active']
    list_editable = ['active']
    autocomplete_fields = ['user']
    list_per_page = 20

    def owner_name(self, obj):
        return obj.user.username

    def owner_email(self, obj):
        return obj.user.email

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "user":
            kwargs["queryset"] = get_user_model().objects.filter(
                user_profile__user_type='1')
        return super().formfield_for_foreignkey(db_field, request, **kwargs)


admin.site.register(InstitutionProfile, InstitutionProfileAdmin)

在这里,如果我不使用 autocomplete_fields,那么外键过滤会起作用,但如果我使用 autocomplete_fields,它会提供所有数据

Without autocomplete_fields

With autocomplete_fields

每当您调用自动完成功能时,都会调用另一个外键的 Admin class 的 get_queryset() 方法,这就是搜索字段显示所有用户的原因,因为 get_queryset() 的用户模型管理员被调用,它返回用户模型的所有对象。

但是,当您尝试使用无效用户保存机构对象时(如您在 formfield_for_foreignkey() 函数中所述),您将收到 'Select a valid choice. That choice is not one of the available choices.' 消息。

不幸的是,您无法从学院模型管理员中过滤外键对象,您必须从用户模型管理员中进行过滤。您可以覆盖用户管理员 class 的 get_search_results() 方法,但这将改变用户管理员的功能,我相信这不是您想要的。