Django - общие представления
В некоторых случаях писать представления, как мы видели ранее, действительно сложно. Представьте, что вам нужна статическая страница или страница со списком. Django предлагает простой способ установить эти простые представления, которые называются общими представлениями.
В отличие от классических представлений, общие представления - это классы, а не функции. Django предлагает набор классов для общих представлений в django.views.generic, и каждое универсальное представление является одним из этих классов или классом, который наследуется от одного из них.
Есть 10+ общих классов -
>>> import django.views.generic
>>> dir(django.views.generic)
['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView',
'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView',
'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView',
'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__',
'__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates',
'detail', 'edit', 'list']
Это можно использовать для общего представления. Давайте посмотрим на пример, чтобы увидеть, как это работает.
Статические страницы
Опубликуем статическую страницу из шаблона static.html.
Наш static.html -
<html>
<body>
This is a static page!!!
</body>
</html>
Если бы мы сделали это так, как узнали раньше, нам пришлось бы изменить myapp/views.py быть -
from django.shortcuts import render
def static(request):
return render(request, 'static.html', {})
и myapp/urls.py быть -
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)
Лучший способ - использовать общие представления. Для этого наш myapp / views.py станет -
from django.views.generic import TemplateView
class StaticView(TemplateView):
template_name = "static.html"
И наш myapp / urls.py мы будем -
from myapp.views import StaticView
from django.conf.urls import patterns
urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)
При доступе к / myapp / static вы получаете -
Для того же результата мы также можем сделать следующее:
- Без изменений в views.py
- Измените файл url.py на -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)
Как видите, во втором методе вам просто нужно изменить файл url.py.
Список и отображение данных из БД
Мы собираемся перечислить все записи в нашей модели Dreamreal. Это легко сделать с помощью универсального класса представления ListView. Отредактируйте файл url.py и обновите его как -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns(
"myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal,
template_name = "dreamreal_list.html")),
)
На этом этапе важно отметить, что переменная, передаваемая общим представлением в шаблон, - это object_list. Если вы хотите назвать его самостоятельно, вам нужно будет добавить аргумент context_object_name в метод as_view. Тогда url.py станет -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^dreamreals/', ListView.as_view(
template_name = "dreamreal_list.html")),
model = Dreamreal, context_object_name = ”dreamreals_objects” ,)
Тогда связанный шаблон будет -
{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}
Доступ к / myapp / dreamreals / откроет следующую страницу -