0

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 它会提供所有数据

没有 autocomplete_fields

使用 autocomplete_fields

4

1 回答 1

0

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

但是,当您尝试使用无效用户保存机构对象时(正如您在 formfield_for_foreignkey() 函数中提到的),您将获得“选择有效选择”。那个选择不是可用的选择之一。信息。

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

于 2020-07-02T05:29:00.700 回答