Django ListView - PullRequest
       0

Django ListView

0 голосов
/ 03 апреля 2020

Я впервые использую ListView, и он не работает и выдает ошибку. Я поставил get_query, но они все еще дают мне ту же ошибку. Как я могу решить проблему? И каждый раз, когда я пишу код в views.py, я всегда использовал «def», а не «class». Но многие люди используют (а также django документы) «класс» для ListView. Так что для общего рендеринга мы используем 'def', а для django .views.generi c мы используем класс, верно? Почему они различают эти два? Это ошибка, которую я получил.

ImproperlyConfigured at /search/results
ListView is missing a QuerySet. Define ListView.model, ListView.queryset, or override ListView.get_queryset().

urls.py

from django.urls import path
from django.conf import settings
from django.views.generic import ListView, TemplateView

from . import views


app_name = 'search'
urlpatterns = [
    path('', TemplateView.as_view(template_name = "search/index.html")),
    path('results', ListView.as_view(template_name = 'search/results.html')),
    path('beerlist', views.beerlist, name='beerlist'),
    path('<int:beerinfo_id>', views.beerinfo, name='beerinfo'),
]

views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.db.models import Q
from django.views.generic import ListView, TemplateView

from .models import Beerinfo

# Create your views here.
def index(TemplateView):
    template_name = 'search/index.html'

def results(ListView):
    model = Beerinfo
    template_name = 'search/results.html'

    def get_queryset(self):
        query = self.request.GET.get('q')
        object_list = Beerinfo.objects.filter(
            Q(name__icontains = query) | Q(label__icontains = query)
        )
        return obejct_list

index. html

<form action="{% url 'search:results' %}" name="se">
    <label for='search'>What do you want to find?</label>
    <input type="text" name='q'>
    <input type="submit">
</form>

results. html

<ul>
    {% for beer in ojbect_list %}
        <li><a href="/search/{{ beer.id }}">{{ beer.name }}</a></li>
    {% endfor %}
</ul>

models.py

from django.db import models

# Create your models here.
class Beerinfo(models.Model):
    name = models.CharField(max_length=100)
    label = models.CharField(max_length=500)

    def __str__(self):
        return self.name

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Вам необходимо определить класс, с которым будет работать представление списка. Например:

class UserListView(ListView):
    model = User

Вы можете использовать функцию (def) для выполнения sh того же, что и класс представления generi c, разница в том, что большая часть того, что вы пишете в функции, уже определено в классе. В моем примере выше, этот класс уже обрабатывает рендеринг шаблона по умолчанию, контекст со списком объектов этого шаблона и нумерацией страниц. Идея состоит в том, чтобы сохранить ваш код DRY.

Вторым преимуществом является то, что он создает стандарт для вашего кода, например, используемый по умолчанию шаблон - %(app_label)s/%(model_name)s%(template_name_suffix)s.html, поэтому, если имя вашего приложения - users, а модель - User, это представление ожидает шаблон с именем users/userlist.html

Чтобы использовать разбиение на страницы, просто установите атрибут paginate_by класса.

Если вы пытаетесь реализовать простое представление (например, все действия CRUD , очень вероятно, что вы выиграете от использования выражений. Еще одна хорошая вещь, которую дают вам классы, - это то, что вы можете наследовать положительные герои, например, вы можете создать класс BaseListView, который наследует от ListView и установить paginate_by на 25. Если все ваши предложения наследуют от BaseListView, тогда весь ваш список будет разбит на 25 элементов.

1 голос
/ 03 апреля 2020

В views.py измените def на class, вам нужно определить класс для использования Listview, Class Results (ListView). В urls.py вы вызываете Listview, вам следует вызывать views.Results.as_view ()

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