我有一个正在工作的FBV搜索功能,如下所示:
def search(request):
query_string = ''
found_entries = None
if ('q' in request.GET) and request.GET['q'].strip():
query_string = request.GET['q']
entry_query_study = get_query(query_string, ['title', 'category', 'service', 'subject', 'industry', 'description', 'keywords', 'objective',])
entry_query_page = get_query(query_string, ['title', 'url', 'category', 'keywords',])
found_entries_study = Study.objects.filter(entry_query_study).order_by('title')
found_entries_page = Page.objects.filter(entry_query_page).order_by('title')
found_entries = list(chain(found_entries_page, found_entries_study))
return render_to_response('search-results.html',
{ 'query_string': query_string, 'found_entries': found_entries },
context_instance=RequestContext(request))我有一个没有工作的CBV搜索函数,其中包含一个类似于以下内容的混合器:
class SearchMixin(object):
def get_queryset(self):
query_string = ''
found_entries = None
if ('q' in request.GET) and request.GET['q'].strip():
query_string = request.GET['q']
entry_query_study = get_query(query_string, ['title', 'category', 'service', 'subject', 'industry', 'description', 'keywords', 'objective',])
entry_query_page = get_query(query_string, ['title', 'url', 'category', 'keywords',])
found_entries_study = Study.objects.filter(entry_query_study).order_by('title')
found_entries_page = Page.objects.filter(entry_query_page).order_by('title')
found_entries = list(chain(found_entries_page, found_entries_study))
return render_to_response('search-results.html',
{ 'query_string': query_string, 'found_entries': found_entries },
context_instance=RequestContext(request))
class SearchResultsView(SearchMixin, TemplateView):
template_name = "search-results.html"
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
context["page"] = Page.objects.filter(get_query(query_string, ['title', 'url', 'category', 'keywords',])).order_by('title')
context["study"] = Study.objects.filter(get_query(query_string, ['title', 'category', 'service', 'subject', 'industry', 'description', 'keywords', 'objective',])).order_by('title')
return context我得到错误query_string是没有定义的。我可以把所有的搜索逻辑放到get_context_data中,但是SearchMixin的意义是什么呢?我想做的是:我有一个搜索框,搜索两个模型页面和学习。它适用于FBV,但我尝试使用一个基于类的视图,以便添加上下文“页面”和上下文“学习”,以便在模板中使用它们在if语句中显示结果。在模板中进行处理是一个不-不,根据精彩的书“Django的两个独家新闻”。
我很难理解的是,如何访问mixin的get_queryset中的数据。否则我只是在重复自己。也许我的结构有问题,显然我需要一些帮助。我阅读了大量的资源,但我很难把它们整合在一起。
我希望在CBV中实现与FBV中相同的功能,并添加我提到的上下文数据,以允许我执行{% if site %}{{ site.title }}{% endif %}或{% if study %}{{ study.title }}{% endif %}等操作。
例如,我很确定render_to_response()不属于get_queryset()的末尾,但是我还应该在那里放什么,把render_to_response放在哪里?我需要帮助把FBV转换成CBV,这样我就可以完成我所说的上下文数据了。
我想也许MultipleObjectMixin可以做这个工作,但是不知道如何使用它,也找不到任何例子。如果有人有,请分享,因为它可能解决问题。
如果有人能帮我,纠正我的代码,给我一个例子,指出我的正确方向,等等。这将是最感谢的。
旁白:自从我开始对如何使用get_queryset和get_context_data有了准确的理解以来,我就遇到了很多麻烦。我知道get_context_data返回上下文,所以您可以在模板中使用变量等。但我不知道如何使用get_queryset。或者它如何连接到get_context_data。
本质上,如何从get_queryset返回两个对象。那又会回到哪里呢?如何从get_queryset返回页面和学习,然后在get_context_data中添加我想要的上下文,最后调用render_to_response。我只是不明白这些都是如何连接的,更不用说如何从get_queryset返回两个对象了。
一些帮助我朝着正确的方向前进,会有很大的帮助。例子是最大的帮助。
发布于 2015-07-13 03:25:44
使用CBV可以遵循的解决方案如下:
class SearchResultsView(TemplateView):
template_name = "search-results.html"
def find_entries(self, query_string):
found_entries = None
found_entries_study = None
found_entries_page = None
if query_string:
entry_query_study = get_query(
query_string,
['title', 'category', 'service', 'subject', 'industry', 'description', 'keywords', 'objective', ]
)
entry_query_page = get_query(query_string, ['title', 'url', 'category', 'keywords', ])
found_entries_study = Study.objects.filter(entry_query_study).order_by('title')
found_entries_page = Page.objects.filter(entry_query_page).order_by('title')
found_entries = list(chain(found_entries_page, found_entries_study))
return found_entries, found_entries_study, found_entries_page
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
query_string = ''
if ('q' in self.request.GET) and self.request.GET['q'].strip():
query_string = self.request.GET['q']
context["all_found_entries"], context["study"], context["page"] = self.find_entries(query_string)
return context我知道这只是实现这一点的一种方式。我只是想给你一个你可以遵循的想法。我希望这能帮助你:)
发布于 2015-07-13 03:15:34
您应该使用ListView。
class SearchResultsView(ListView):
template_name = 'search-results.html'
context_object_name = 'found_entries'
def get_queryset(self):
...
return list(chain(found_entries_page, found_entries_study))
def get_context_data(self, **kwargs):
context = super(SearchResultsView, self).get_context_data(**kwargs)
context["query_string"] = self.request.GET.get('q')
context["pages"] = ...
context["studies"] = ...
return contextget_queryset返回的列表将在模板中以found_entries形式可用
https://stackoverflow.com/questions/31374299
复制相似问题