首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Mixins搜索函数

Django Mixins搜索函数
EN

Stack Overflow用户
提问于 2015-07-13 01:33:25
回答 2查看 619关注 0票数 0

我有一个正在工作的FBV搜索功能,如下所示:

代码语言:javascript
复制
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搜索函数,其中包含一个类似于以下内容的混合器:

代码语言:javascript
复制
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返回两个对象了。

一些帮助我朝着正确的方向前进,会有很大的帮助。例子是最大的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-13 03:25:44

使用CBV可以遵循的解决方案如下:

代码语言:javascript
复制
 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

我知道这只是实现这一点的一种方式。我只是想给你一个你可以遵循的想法。我希望这能帮助你:)

票数 1
EN

Stack Overflow用户

发布于 2015-07-13 03:15:34

您应该使用ListView

代码语言:javascript
复制
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 context

get_queryset返回的列表将在模板中以found_entries形式可用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31374299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档