django admin当字段是自动完成时,它会覆盖ModelForm过滤器



我有Django admin的问题。我想要我的一个外键字段是可搜索的,我实现了使它自动完成。

class CollectionAdmin(VersionAdmin, admin.ModelAdmin):
form = CollectionForm
autocomplete_fields = ["task"]

我还过滤了ModelForm中的外键。

class CollectionForm(forms.ModelForm):
class Meta:
model = Collection
fields = "__all__"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.fields.get("task"):
self.fields["task"].queryset = self.fields["task"].queryset.filter(
status=TaskStatus.ASSIGNED
)
当任务为而非

时Collection my filter中的自动完成字段按预期工作.但是,当任务为时,自动完成字段,过滤器不起作用.而不是我的过滤器的形式,任务adminget_queryset方法被调用,这不是我想要的。

TaskAdmin.get_queryset方法只是按用户过滤,但是我想要更多的过滤器,正如你在上面看到的,对于TaskStatus也是如此。

def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.groups.filter(name=settings.COPYWRITER_GROUP).exists():
return qs.filter(assigned_to=request.user)
return qs

重复,如果字段不是自动完成,表单初始化过滤器工作。

我试着从Collection的自动完成中删除任务,它工作了。

如果字段是自动完成的,我希望我的表单过滤器不会被覆盖。

回答我自己的问题。当您使字段自动完成时,它直接触发该模型admin的get_queryset方法。所以,在我的情况下,TaskAdmin get_queryset每次被调用时,我试图从下拉菜单中选择值。这就是为什么,表单过滤器变得无用,我们可以完全删除过滤器。解决方法是在TaskAdmin get_queryset中有条件地过滤对象。我举个例子,

path = request.path
if "autocomplete" in path:
return super().get_queryset(request).filter()
else:
return super().get_queryset(request)

如果从下拉菜单中调用,将过滤queryset。Thansk !

最新更新