如何在django grappelli中过滤自动完成结果?

时间:2013-07-25 08:01:21

标签: python django autocomplete django-queryset django-grappelli

我们有一个软删除方案,我们只是将事物标记为已删除,然后在各个地方过滤掉已删除的内容。我正在试图弄清楚如何从grapeoli自动完成建议中过滤掉已删除的那些。

3 个答案:

答案 0 :(得分:7)

最后我接受了这个:

from grappelli.views.related import AutocompleteLookup

class YPAutocompleteLookup(AutocompleteLookup):
    """ patch grappelli's autocomplete to let us control the queryset 
    by creating a autocomplete_queryset function on the model """
    def get_queryset(self):
        if hasattr(self.model, "autocomplete_queryset"):
            qs = self.model.autocomplete_queryset()
        else:
            qs = self.model._default_manager.all()
        qs = self.get_filtered_queryset(qs)
        qs = self.get_searched_queryset(qs)
        return qs.distinct()

可以通过覆盖相关网址来安装:

url(r'^grappelli/lookup/autocomplete/$', YPAutocompleteLookup.as_view(), name="grp_autocomplete_lookup"),

确保在你的网址中领先于Grappelli。

答案 1 :(得分:1)

如果您使用Admin网站,则应该利用ModelAdmin.queryset函数: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset

正如我发现的那样,更改默认模型管理器以限制结果是一个坏主意,导致各种令人讨厌的问题。例如:阻止syncdb,shell或shell_plus运行。无法将第一条记录添加到空白数据库中。确切的错误取决于你的限制,但你一定会得到一些。

这里需要一种方法来告诉Grappelli要使用的queryset管理器的名称。或许通过或设置?

您可以使用ForeignKey.limit_choices_to指定简单(常量或相关字段)过滤器。 Grappelli获取此值并将其作为参数'query_string'发送到GET中。

然而,这可能还不够。我向Grappelli repo发布了一个请求,我用它来添加指定要使用的记录管理器的方法,或者只是自动使用admin queryset(ModelAdmin.queryset)。

我的帖子在这里: https://github.com/sehmaschine/django-grappelli/issues/362

答案 2 :(得分:0)

看起来你可以以某种方式将额外的搜索参数传递给ajax自动完成器。可能需要一个前端黑客。

https://github.com/sehmaschine/django-grappelli/blob/master/grappelli/views/related.py#L101

OR

您可以让模型的默认管理器返回已经过滤的列表,并让需要明确查看已删除项目的地点删除该限制。

这可能会使您的默认情况变得更加容易。