我们有一个软删除方案,我们只是将事物标记为已删除,然后在各个地方过滤掉已删除的内容。我正在试图弄清楚如何从grapeoli自动完成建议中过滤掉已删除的那些。
答案 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
您可以让模型的默认管理器返回已经过滤的列表,并让需要明确查看已删除项目的地点删除该限制。
这可能会使您的默认情况变得更加容易。