在 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() 方法,但这将改变用户管理员的功能,我相信这不是您想要的。
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() 方法,但这将改变用户管理员的功能,我相信这不是您想要的。