我们有一个软删除方案,我们只需将内容标记为已删除,然后在各个位置过滤已删除的内容。我试图弄清楚如何从gratelli自动完成建议中过滤掉已删除的内容。
3 回答
最后我选择了这个:
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 之前。
如果您使用管理站点,您应该利用 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
看起来您可以以某种方式将额外的搜索参数传递给 ajax 自动完成器。可能需要前端破解。
https://github.com/sehmaschine/django-grappelli/blob/master/grappelli/views/related.py#L101
或者
您可以使模型的默认管理器返回一个已过滤的列表,并让需要明确查看已删除项目的位置删除该限制。
这可能会使您的默认情况更容易全面。