Einer der vorherigen Artikel zeigte eine Option zum Implementieren einer Seite mit Artikelpaginierung, die beispielsweise die Hauptseite der Website sein kann. Dies verwendete django-bootstrap3.
Wenn die Seite jedoch keine besonderen Funktionen bietet, außer beispielsweise der Anzeige einer Artikelliste, müssen Sie generische Klassen verwenden. Eine davon ist ListView . Dadurch wird der Programmcode des Projekts reduziert und entsprechend vereinfacht.
Mit der ListView -Klasse können Sie die Vorlage angeben, die zum Anzeigen der Tabelle gerendert wird, das Datenmodell oder Abfrageset angeben, das angezeigt werden muss, sowie die Anzahl der Objekte pro Seite, die angezeigt werden sollen beim Seitenumbruch angezeigt werden.
IndexView
Erinnern wir uns, wie die vorherige Version der View-Klasse zum Anzeigen einer Liste von Seiten aussah.
class IndexView(View): def get(self, request): context = {} # Забираем все опубликованные статье отсортировав их по дате публикации all_articles = Article.objects.filter(article_status=True).order_by('-article_date') # Создаём Paginator, в который передаём статьи и указываем, # что их будет 10 штук на одну страницу current_page = Paginator(all_articles, 10) # Pagination в django_bootstrap3 посылает запрос вот в таком виде: # "GET /?page=2 HTTP/1.0" 200, # Поэтому нужно забрать page и попытаться передать его в Paginator, # для нахождения страницы page = request.GET.get('page') try: # Если существует, то выбираем эту страницу context['article_lists'] = current_page.page(page) except PageNotAnInteger: # Если None, то выбираем первую страницу context['article_lists'] = current_page.page(1) except EmptyPage: # Если вышли за последнюю страницу, то возвращаем последнюю context['article_lists'] = current_page.page(current_page.num_pages) return render_to_response('home/index.html', context)
Wenn Sie alle Kommentare entfernen, erhalten Sie immer noch 15 Zeilen.Außerdem ist dies eine separate Klasse. Und wenn es viele solcher View-Klassen gibt, kann sich herausstellen, dass jede doppelten Code hat. Aus diesem Grund müssen Sie Generika wie ListView verwenden.
Dieselbe Klasse, geerbt von ListView , könnte so aussehen:
class IndexView(ListView): template_name = 'home/index.html' queryset = Article.objects.filter(article_status=True).order_by('-article_date') paginate_by = 10
Ziemlich gut, nur 4 Zeilen, aber Sie können noch weiter gehen und alles auf einmal in die Datei urls.py schreiben. Und aus der Datei views.py wird es möglich sein, IndexView zu entfernen.
from django.conf.urls import url from django.views.generic import ListView from knowledge.models import Article app_name = 'home' urlpatterns = [ url(r'^$', ListView.as_view( template_name='home/index.html', queryset=Article.objects.filter( article_status=True, ).order_by( '-article_date' ), paginate_by=10 ), name='index'), ]
django-bootstrap3
Aber beim Erstellen von Paginierungslinks mit django-bootstrap3 gibt es eine Einschränkung. Tatsache ist, dass bootstrap_pagination im Template ein Objekt vom Typ Page. übernimmt. Und wenn wir in der alten Version nur dieses Objekt an den Kontext übergeben haben, dann generiert ListView ein reguläres QuerySet , das eignet sich nicht für * bootstrap_pagination. Aber die ListView übergibt auch ein page_obj -Objekt in den Kontext, was für bootstrap_pagination. * genau richtig ist.
Mal sehen, wie die Vorlage home/index.html jetzt aussehen wird.
{% extends 'home/base.html' %} {% block page %} <h1>Публикации</h1> {% if article_lists %} {% for article in object_list %} <article> <a href="{{ article.get_absolute_url }}"> <h2>{{ article.article_title }}</h2> </a> {{ article.desctription|safe }} <p><a class="btn btn-default btn-sm" href="{{ article.get_absolute_url }}">Читать далее</a></p> </article> {% endfor %} {% endif %} {% load bootstrap3 %} {% bootstrap_pagination page_obj %} {% endblock %}
Wie Sie sehen, gibt es zwei wesentliche Änderungen gegenüber der vorherigen Version:
- page_obj statt article_lists in boostrap_pagination
- Objektliste statt Artikellisten
ListView hat jedoch eine Variable context_object_name , die für den Namen der Variablen im Kontext verantwortlich ist, sodass Sie auch article_lists. belassen könnten.
Für Django empfehle ich Timeweb-Hoster VDS-Server .