【问题标题】:Using Django's Q to get search result from CBV's使用 Django 的 Q 从 CBV 中获取搜索结果
【发布时间】:2018-09-18 20:26:42
【问题描述】:

我正在尝试在我的 CBV 的 ListView 中实现一个简单的搜索功能,下面是我的 ListView 的样子

class Postlist(SelectRelatedMixin, ListView):
    model = Post
    select_related = ('user', 'group')

我想实现这样的目标(来源:Youtube video on how to add search

def post_list(request):
    posts = Post.objects.all()
    query = request.GET.get('q')
    if query:
        posts = Post.objects.filter(
            Q(title__icontains=query)|
            Q(user__username=query)|
            Q(body__icontains=query)

        )
    context = {
        'posts': posts,
    }
    return render(request, 'blog/post_list.html', context)

但我想我无法解释 SelectRelatedMixin。我可以使用任何一个。 FBV 或 CBV,只要我能让搜索正常工作

我尝试了下面的代码。我得到 NameError: name 'query' is not defined

class Postlist(SelectRelatedMixin, ListView):
    model = Post    

    posts = Post.objects.filter(
        Q(title__icontains=query) |
        Q(user__username=query) |
        Q(body__icontains=query)
    ).select_related('user', 'group')

【问题讨论】:

  • 什么是SelectRelatedMixin?功能视图有什么问题,如果它做你想做的事?
  • 为什么你不能用功能视图做到这一点?
  • 您面临的问题是什么?我们需要更多信息

标签: python django django-views


【解决方案1】:

在基于函数的视图中,您只需在查询集上调用select_related()

posts = Post.objects.filter(
    Q(title__icontains=query)|
    Q(user__username=query)|
    Q(body__icontains=query)
).select_related('user', 'group')

在基于类的视图中,您可以覆盖get_queryset

class Postlist(SelectRelatedMixin, ListView):
    model = Post
    select_related = ('user', 'group')

    def get_queryset(self):
        queryset = super(Postlist, self).get_queryset()
        query = self.request.GET.get('q')
        if query:
            queryset = queryset.filter(
                Q(title__icontains=query)|
                Q(user__username=query)|
                Q(body__icontains=query)
            )
        return queryset

【讨论】:

  • 这是你的意思吗,如果我这样做我得到 NameError: name 'query' is not defined class Postlist(SelectRelatedMixin, ListView): model = Post posts = Post.objects.filter( Q( title__icontains=query) | Q(user__username=query) | Q(body__icontains=query) ).select_related('user', 'group')
  • 请不要在 cmets 中发布代码,无法阅读。 posts = Post.objects.filter(...) 用于基于函数的视图。如果您使用的是基于类的视图,请像我的回答一样覆盖 get_queryset
  • 感谢工作。还指出在 cmets 中添加代码
  • 你认为你能帮我解决一个类似的 django 问题吗stackoverflow.com/questions/49588341/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多