7

我们有一个软删除方案,我们只需将内容标记为已删除,然后在各个位置过滤已删除的内容。我试图弄清楚如何从gratelli自动完成建议中过滤掉已删除的内容。

4

3 回答 3

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 来安装:

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

确保这在您的网址中位于 Grappelli 之前。

于 2013-07-25T09:47:29.233 回答
1

如果您使用管理站点,您应该利用 ModelAdmin.queryset 功能: https ://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.queryset

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

这里需要一种方法来告诉 Grappelli 要使用的查询集管理器的名称。传入或设置?

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

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

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

于 2013-07-31T21:44:13.373 回答
0

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

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

或者

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

这可能会使您的默认情况更容易全面。

于 2013-07-25T09:18:27.513 回答