Django self.request не фильтрует через запрос - PullRequest
1 голос
/ 25 марта 2019

Я пытаюсь выполнить базовый поиск в шаблоне поиска, но когда я выполняю поиск, он работает по 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>

Пример: enter image description here

Ответы [ 4 ]

2 голосов
/ 25 марта 2019

ваш 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
0 голосов
/ 25 марта 2019

Прежде всего, я бы предложил посетить 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
0 голосов
/ 25 марта 2019

Ваша проблема в том, что вы создали случайную функцию в своем классе, которая ничего не переопределяет.То, что вы пытаетесь сделать, это переопределить 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
0 голосов
/ 25 марта 2019

Вы забыли 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.

check pep-8 для Имен методов и переменных экземпляра

def search_list_view:
    ....

и для того, что вы пытаетесь достичь, лучше переопределить get_queryset из ListView.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...