4
A
回答
0
在這裏你可能會開始:
子類
django.contrib.admin.views.main.ChangeList
管理視圖類,覆蓋get_query_set
方法返回一個查詢集,是以「OR」關鍵字考慮在內。告訴你的ModelAdmin類使用新
ChangeList
子類:
在你admin.py
文件:
from django.contrib.admin.views.main import ChangeList
class YourChangeList(ChangeList)
def get_query_set(self):
# I'll leave this part to you...
class YourAdminClass(admin.ModelAdmin):
def __init__(self):
super(YourAdminClass, self).__init__()
self.changelist_view = YourChangeListClass
2
下面是一個更完整的片段:
from django.contrib.admin.views.main import ChangeList
from django.db import models
import operator
class MyChangeList(ChangeList):
def __init__(self, *a):
super(MyChangeList, self).__init__(*a)
def get_query_set(self, request):
# First, we collect all the declared list filters.
(self.filter_specs, self.has_filters, remaining_lookup_params,
use_distinct) = self.get_filters(request)
# Then, we let every list filter modify the queryset to its liking.
qs = self.root_query_set
for filter_spec in self.filter_specs:
new_qs = filter_spec.queryset(request, qs)
if new_qs is not None:
qs = new_qs
try:
# Finally, we apply the remaining lookup parameters from the query
# string (i.e. those that haven't already been processed by the
# filters).
qs = qs.filter(**remaining_lookup_params)
except (SuspiciousOperation, ImproperlyConfigured):
# Allow certain types of errors to be re-raised as-is so that the
# caller can treat them in a special way.
raise
except Exception, e:
# Every other error is caught with a naked except, because we don't
# have any other way of validating lookup parameters. They might be
# invalid if the keyword arguments are incorrect, or if the values
# are not in the correct type, so we might get FieldError,
# ValueError, ValidationError, or ?.
raise IncorrectLookupParameters(e)
# Use select_related() if one of the list_display options is a field
# with a relationship and the provided queryset doesn't already have
# select_related defined.
if not qs.query.select_related:
if self.list_select_related:
qs = qs.select_related()
else:
for field_name in self.list_display:
try:
field = self.lookup_opts.get_field(field_name)
except models.FieldDoesNotExist:
pass
else:
if isinstance(field.rel, models.ManyToOneRel):
qs = qs.select_related()
break
# Set ordering.
ordering = self.get_ordering(request, qs)
qs = qs.order_by(*ordering)
# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
elif field_name.startswith('@'):
return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name
if self.search_fields and self.query:
orm_lookups = [construct_search(str(search_field))
for search_field in self.search_fields]
or_queries = []
for bit in self.query.split():
or_queries += [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
if len(or_queries) > 0:
qs = qs.filter(reduce(operator.or_, or_queries))
if not use_distinct:
for search_spec in orm_lookups:
if lookup_needs_distinct(self.lookup_opts, search_spec):
use_distinct = True
break
if use_distinct:
return qs.distinct()
else:
return qs
,並在您的ModelAdmin
def get_changelist(*a, **k):
return MyChangeList
+0
您應該使用真實的用戶名並更新您的配置文件,那麼您的貢獻將會更加嚴肅。 – nalply 2012-10-05 18:09:55
2
這改變了Django 1.8(或可能更快)。這是什麼爲我工作:
class MyAdmin(admin.ModelAdmin):
def get_search_results(self, request, queryset, search_term):
"""
Returns a tuple containing a queryset to implement the search,
and a boolean indicating if the results may contain duplicates.
"""
# Apply keyword searches.
def construct_search(field_name):
if field_name.startswith('^'):
return "%s__istartswith" % field_name[1:]
elif field_name.startswith('='):
return "%s__iexact" % field_name[1:]
elif field_name.startswith('@'):
return "%s__search" % field_name[1:]
else:
return "%s__icontains" % field_name
use_distinct = False
search_fields = self.get_search_fields(request)
# starts here
filters = models.Q()
if search_fields and search_term:
orm_lookups = [construct_search(str(search_field))
for search_field in search_fields]
for bit in search_term.split():
or_queries = [models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups]
# this | operation of Q()'s is the ticket.
filters = filters | models.Q(reduce(operator.or_, or_queries))
if not use_distinct:
for search_spec in orm_lookups:
if admin.utils.lookup_needs_distinct(self.opts, search_spec):
use_distinct = True
break
# finally
queryset = queryset.filter(filters)
return queryset, use_distinct
相關問題
- 1. Django管理員搜索通配符
- 2. Django管理搜索
- 3. Python通配符搜索 - 搜索詞之間的空白
- 4. 管理員搜索查詢
- 5. Django管理搜索優化
- 6. Django管理搜索與^和=運營商多字詞組
- 7. 搜索運算符的cstring
- 8. 如何設置Django管理員搜索字段?
- 9. 索引之間的搜索
- 10. 如何讓vimgrep做詞匹配搜索?
- 11. MongoDB文本搜索和詞搜索的多個搜索詞
- 12. 搜索在燒瓶管理員
- 13. Active Directory搜索 - 按管理員篩選
- 14. 遞歸詞搜索算法
- 15. 單詞搜索算法
- 16. 刪除多搜索中的搜索運算符(AND/OR)jqGrid
- 17. Jqgrid預先搜索,所有搜索運算符不顯示在搜索運算符下拉列表中
- 18. 管理員搜索不適用於我的字段 - Django
- 19. Python'in'運算符搜索算法
- 20. Azure搜索索引 - 搜索確切詞
- 21. 在索引中搜索作爲搜索詞的前綴的詞(反之亦然)(!)
- 22. 如何使用android搜索管理器重置搜索
- 23. 試圖計算搜索詞之間的相似度
- 24. elasticsearch通配符搜索和運算符
- 25. 這個django管理員搜索控件叫什麼名字?
- 26. Django管理員搜索/篩選功能作爲頁表
- 27. Django管理員搜索應該也包含內嵌字段
- 28. 在Django中按用戶名字段搜索管理員
- 29. 獅身人面像在Django搜索管理員
- 30. 谷歌的搜索運算符AND
所以當有人搜索這「這是什麼」你想你的查詢是「...其中x像'%here%'或x像'%is%'或x像'%something%'「? – 2010-08-18 21:15:59
不,我的意思是一個查詢「這裏或是某個東西」會變成那個...... – 2010-08-19 10:21:09