【问题标题】:Django self.request not filtering though queryDjango self.request 不通过查询过滤
【发布时间】:2019-08-16 03:25:33
【问题描述】:

我试图在我的搜索模板中实现一些基本搜索,但是当我搜索时,它可以在 URL 中工作,但不会更改模板中的任何帖子。

观看次数:

class SearchListView(ListView):
    model = Post
    template_name = "public/search.html"

    def get_context_data(self, **kwargs):
        context = super(SearchListView, self).get_context_data(**kwargs)
        context['queryset'] = Post.objects.filter(live=True)
        context['category'] = Category.objects.all()
        return context

    def SearchListView(request):
        query = self.request.GET.get("q")
        if query:
            queryset = queryset.filter(title_icontains=query)

我不确定这是否是正确的设置方法,因为我正在观看的教程没有使用基于类的视图。

HTML:

<div class="container mt-5 mb-5">
    <div class="banner-search-main mb-5">
        <form method='GET' action=''>
            <p class="text-muted">Keywords:</p>
            <input type="text" name='q' class="homebanner-search" placeholder="Enter your keywords" value='{{ request.get.q }}'>
            <input type="submit" value="search">
        </form>
    </div>
    <div class="detail-container">
        {% for post in queryset %}
            <div class="col-sm card-container">
                <a href="{% url 'post-detail' post.slug %}">
                    <div class="main-card">
                        <div class="main-card-img">
                            <img src="https://via.placeholder.com/270x150" class="card-img-top" alt="#">
                        </div>
                        <div class="main-card-body">
                            <p class="featured-category category-{{ post.category.colorcode }}">{{ post.category }}</p>
                            <p class="featured-title">{{ post.title }}</p>
                            <div class="featured-authcat">
                                <p class="featured-author mr-3"><i class="fas fa-user mr-1"></i>{{ post.author|title }}</p>
                            </div>
                            <p class="featured-subtitle">{{ post.sub_description|truncatewords:25 }}</p>
                        </div>
                    </div>
                </a>
            </div>
        {% endfor %}
    </div>
</div>

示例:

【问题讨论】:

  • 您是否检查过您是否真的看到了查询?只需打印它,看看它是无还是运动

标签: python html django search


【解决方案1】:

您的 ListView 与 get_queryset 方法

class SearchListView(ListView):
    model = Post
    template_name = "public/search.html"

    def get_queryset(self):
       queryset = super().get_queryset().filter(live=True)
       query = self.request.GET.get("q")
       if query:
        queryset = queryset.filter(title__icontains=query)
       return queryset

    def get_context_data(self, **kwargs):
       context = super(SearchListView, self).get_context_data(**kwargs)
       context['queryset'] = self.get_queryset()
       context['category'] = Category.objects.all()
       return context

【讨论】:

  • 似乎出现“超出最大递归深度”错误
  • 啊,是的,修复了它……但是得到一个“无法将关键字 'title_icontains' 解析到字段中。”这很奇怪......
  • 您的 Post 模型中有字段标题吗?也许拼写错误它的标题__icontains
【解决方案2】:

首先,我建议访问this 以查看基于类的视图的基础结构。

class SearchListView(ListView):
    model = Post
    template_name = "public/search.html"
    success_url ='where you want to redirect'


    def get_queryset(self): # method that returns the queryset is `get_queryset`
       query = self.request.GET.get("q")
       if query:
        queryset = self.model.objects.filter(title__icontains=query) # double underscore not single
       return queryset

    def get_context_data(self, **kwargs):
       context = super(SearchListView, self).get_context_data(**kwargs)
       context['queryset'] = self.get_queryset()
       context['category'] = Category.objects.all()
       return context

【讨论】:

    【解决方案3】:

    你的问题是你在你的类中创建了一个随机函数,它不会覆盖任何东西。你想要做的是覆盖get_queryset()

    class SearchListView(ListView):
        model = Post
        template_name = "public/search.html"
    
        def get_context_data(self, **kwargs):
            context = super(SearchListView, self).get_context_data(**kwargs)
            context['queryset'] = self.get_queryset()
            context['category'] = Category.objects.all()
            return context
    
        def get_queryset(self):
            queryset = super().get_queryset().filter(live=True)
            query = self.request.GET.get("q")
            if query:
                queryset = queryset.filter(title__icontains=query)
            return queryset
    

    【讨论】:

      【解决方案4】:

      您忘记了 self 作为 searchListView 中的第一个参数

      def SearchListView(self, request):
          query = self.request.GET.get("q")
          if query:
              queryset = queryset.filter(title_icontains=query)
      

      为了更好的pythonic pep-8风格,函数名应该是search_list_view

      检查 pep-8 是否有 Method Names and Instance Variables

      def search_list_view:
          ....
      

      对于您要完成的工作,最好从 ListView 覆盖 get_queryset

      def get_context_data(self, **kwargs):
          context = super(SearchListView, self).get_context_data(**kwargs)
          context['queryset'] = self.get_queryset()
          context['category'] = Category.objects.all()
          return context
      
      def get_queryset(self):
          queryset = super(SearchListView, self).get_queryset().filter(live=True)
          query = self.request.GET.get("q")
          if query:
              queryset = queryset.filter(title__icontains=query)
          return queryset
      

      【讨论】:

      • 这仍然不起作用。我认为它与 queryset = queryset.filter 部分有关?我不认为我做的那部分是正确的。
      • 我更新了答案,因为最好使用get_queryset。
      • 为 get_context_data 更新,并在查询集过滤器中添加 live=True。
      猜你喜欢
      • 2016-01-14
      • 2021-04-02
      • 2014-01-08
      • 2020-08-22
      • 2019-04-15
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多