【问题标题】:Add filters to autocomplete fields in django将过滤器添加到 django 中的自动完成字段
【发布时间】:2022-10-25 13:09:35
【问题描述】:

我对 django 中的自动完成字段有疑问。

假设我们有这两个模型:

class Animal:     
    name = models.CharField()     
    is_big = models.BooleanField()  

class Human:     
    pet = models.ForeignKey(Animal)

然后我们有一个看起来像这样的管理文件:

class HumanAdmin(admin.ModelAdmin):
    autocomplete_fields = ['pet']

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == 'pet':
            kwargs["queryset"] = Animal.objects.filter(is_big=True)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

class AnimalAdmin(admin.ModelAdmin):
    search_fields = ['name']

admin.site.register(Animal, AnimalAdmin)
admin.site.register(Human, HumanAdmin)

我想在这里实现的是在动物选择下拉列表中只包含有效的大动物,然后我决定将其归档为自动完成但在使其自动完成后似乎忽略了我的formfield_for_foreignkey过滤器,它是现在加载所有的动物。

我想问我应该如何正确地将这两者结合起来?我想要一个动物的自动完成字段,但我希望它只考虑那些有 is_big == True 的人。

我的想法是我应该以某种方式捕获在自动完成文本字段中输入的内容并将其添加到我的过滤中,但我不知道该怎么做。

【问题讨论】:

    标签: django django-models django-admin


    【解决方案1】:

    尝试在AnimalAdmin 中覆盖get_search_result

    class AnimalAdmin(admin.ModelAdmin):
        search_fields = ['name']
    
        def get_search_results(self, request, queryset, search_term):
            queryset, use_distinct = super().get_search_results(
                request,
                queryset,
                search_term,
            )
            queryset = queryset.filter(is_big=True)
    
            return queryset, use_distinct
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      相关资源
      最近更新 更多