【发布时间】:2013-07-25 00:12:59
【问题描述】:
我们有一个软删除方案,我们只需将内容标记为已删除,然后在各个位置过滤已删除的内容。我试图弄清楚如何从gratelli自动完成建议中过滤掉已删除的内容。
【问题讨论】:
标签: python django autocomplete django-queryset django-grappelli
我们有一个软删除方案,我们只需将内容标记为已删除,然后在各个位置过滤已删除的内容。我试图弄清楚如何从gratelli自动完成建议中过滤掉已删除的内容。
【问题讨论】:
标签: python django autocomplete django-queryset django-grappelli
看起来您可以以某种方式将额外的搜索参数传递给 ajax 自动完成器。可能需要前端 hack。
https://github.com/sehmaschine/django-grappelli/blob/master/grappelli/views/related.py#L101
您可以让模型的默认管理器返回一个已过滤的列表,并让需要明确查看已删除项目的位置移除该限制。
这可能会使默认情况对您来说更容易。
【讨论】:
最后我选择了这个:
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
【讨论】: