Как создать функцию поиска в представлении списка на основе классов? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь создать функцию поиска по названию моих сообщений. Сейчас я пытаюсь реализовать этот поиск с использованием фильтра, но представление списка не отображается. Я не уверен, должен ли я реализовать URL для своей функции поиска.

Это моя модель:

class Post(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(default = 'default0.jpg', upload_to='course_image/')
description = models.TextField()
price = models.DecimalField(decimal_places=2, max_digits=6)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
feedback = models.ManyToManyField(Feedback)

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('post-detail', kwargs={'pk' : self.pk})

Это мой вид списка на основе классов:

class PostListView(ListView):
model = Post
template_name = 'store/sub_home.html' # <app>/<model>_<viewtype>.html
context_object_name = 'posts'
ordering = ['date_posted']
paginate_by = 12

def get_queryset(self):
    object_list = super(PostListView, self).get_queryset()
    search = self.request.GET.get('q', None)
    if search:
        object_list = object_list.filter(title__icontains = title)
    return object_list

Это моя строка поиска:

<div id="search">
<form method='GET' action=''>
  <input type="text" name='q' placeholder="">
  <button id='search_holder'>
    <img src="/static/store/search_icon.gif" id="search_icon">        
  </button>
</form>
</div>

Это мой HTML, который отображает сообщения:

{% extends "store/base.html" %}  
{% block content %}
{% include "store/home_ext.html" %}
<div style="padding-top: 20px;" id="main" >
<section class="text-center mb-4">
  <div class="row" id="random"> 
    {% for post in posts %}   
    {% include "store/card.html" %}
    {% endfor %}
  </div>
  <div class="row" id="subscription" style="display: none;">
    {% if not subs %}
    <h2>You have not subscribed to any course :/</h2>
    {% endif %} 
    {% for post in subs %}
    {% include "store/card.html" %}
    {% endfor %}
  </div>
  <div class="row" id="content" style="display: none;"> 
    {% if not mine %}
    <h2>You have not published anything :/</h2>
    {% endif %}   
    {% for post in mine %}
    {% include "store/card.html" %}
    {% endfor %}
  </div>
</section>
{% include "store/pagination.html" %}
</div>
{% endblock content %}

Это моя карточка.html:

{% load extra_filter %}
<div class="col-lg-3 col-md-6 mb-4">            
        <div id="course_card">            
          <div class="view overlay">
            <img style="margin-left: -10px;" src="{{ post.image.url }}" alt="">
          </div>                                    
          <div>                

            <div>
              <strong>
                {% if user.is_authenticated %}
                <a class="title" href="{% url 'post-detail' post.id %}" >
                {% else %}
                <a class="title" href="{% url 'login' %}" >
                {% endif %}
                  {% if post.title|length < 30 %}
                  <span>{{ post.title }}</span> 
                  {% else %}
                  <span>{{ post.title|cut:27 }}</span>
                  {% endif %}
                  <span  style="background-color: rgb(253, 98, 98);" class="badge badge-pill danger-color">NEW
                  </span> 
                </a>
              </strong>
            </div>

             <div class="star-ratings-css">
            <div class="star-ratings-css-top" style="width: {{ post.feedback|calc_rating }}%"><span>★</span><span>★</span><span>★</span><span>★</span><span>★</span></div>
            <div class="star-ratings-css-bottom"><span>★</span><span>★</span><span>★</span><span>★</span><span>★</span></div>
            </div>

            <a href="{% url 'user-posts' post.author.username %}" class="author">
              by {{ post.author }} 
            </a>

           <div>
              <strong style="text-align: right;" class="price">S${{ post.price }}
              </strong>
            </div>
            <small class="date">
               {{ post.date_posted|date:'d F y'}}
            </small>
          </div>            
        </div>            
      </div>   

1 Ответ

1 голос
/ 03 июля 2019

Как отметил в комментариях Налин Добхал, context_object_name должно быть posts, а не post.Потому что в шаблоне вы перебираете контекстную переменную posts.Кроме того, при использовании функции поиска реализация должна выглядеть следующим образом:

class PostListView(ListView):
    model = Post
    template_name = 'store/sub_home.html' # /_.html
    context_object_name = 'posts'
    ordering = ['date_posted']
    paginate_by = 12

    def get_queryset(self, *args, **kwargs):
        object_list = super(PostListView, self).get_queryset(*args, **kwargs)
        <b>search = self.request.GET.get('q', None)
        if search:
            object_list = object_list.filter(title__icontains = search)</b>
        return object_list

Поскольку вы отправляете поисковый запрос через URL querystring (то есть: urlбудет выглядеть как /posts/?q=title в браузере).Я использую request.GET.get('q') для извлечения этих значений строки запроса и использую его для фильтрации набора запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...