【问题标题】:Filter queryset for foreign key in Django autocomplete_fields在 Django autocomplete_fields 中过滤外键的查询集
【发布时间】:2020-10-22 05:58:25
【问题描述】:

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

【问题讨论】:

    标签: django autocomplete-fields


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2014-01-08
      • 2020-06-22
      • 1970-01-01
      • 2011-05-16
      • 2023-03-11
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多