Przegląd nowych "Generic Views" Django opartych o klasy
W Django dostępne były "generyczne" widoki upraszczające tworzenie widoków o często powtarzającej się funkcjonalności. W Django 1.3 wprowadzono zupełnie nowy typ ogólnych, "generycznych" widoków opartych o klasy. Stary system oparty o funkcje został oznaczony jako przestarzały (czyli zostanie usunięty w przyszłych wydaniach frameworka). Opis jak i referencje nowych widoków znajdziemy w dokumentacji. Poniżej przedstawię je na kilku przykładach.
Na potrzeby tego artykułu stworzyłem prosty projekt Django a w nim aplikację "book". Do wyświetlenia statycznej strony (szablonu) można użyć widoku TemplateView tworząc w views.py taki oto kod:
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
Gdzie atrybut template_name przechowuje nazwę (ze ścieżką) szablonu jaki ma zostać użyty. W katalogu "templates" stworzyłem prosty szablon o takiej nazwie (zawartość nieistotna)
W urls.py dodaję import:Gdy teraz otworzymy adres "/about/" naszej aplikacji to powinniśmy zobaczyć nasz testowy szablon. Tak wygląda użycie "generycznego" widoku na szybko.
Klasa TemplateView służy do wyświetlania statycznych widoków. Wystarczy podać atrybut template_name - co wylistowane jest w referencji widoku.
Z klas tych można korzystać także bezpośrednio w urls.py przy mapowaniu linków na widoki. Wystarczy że zaimportujemy TemplateView i użyjemy takiego mapowania:Nazwę szablonu przekazujemy jako argument i gotowe. Dla tego rozwiązania nie jest potrzebny żaden widok z views.py.
Kolejny prosty widok to RedirectView, który przekierowuje na podany adres URL. Używa takich atrybutów jak url - adres przekierowania, permanent (True - użyje kodu 301, False - użyje kodu 302; domyślnie True), czy query_string na opcjonalne parametry GET. Użycie tego widoku jest proste:Widoki obiektów
Zazwyczaj do czynienia mamy z widokami pracującymi na obiektach - na danych pochodzących z bazy danych. W nowym systemie "generycznych" widoków są też i takie, które operują na modelach. Widok ListView służy do listowania wpisów podanego modelu.
Dla przykładu stworzyłem dwa modele:from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
class Meta:
ordering = ["-name"]
def __unicode__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
from django.views.generic import ListView
from book.models import *
class ListPublishers(ListView):
model = Publisher
class ListPublishers(ListView):
model = Publisher
context_object_name="publisher_list"
queryset = Publisher.objects.all().order_by('name')
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(ListPublishers, self).get_context_data(**kwargs)
# Add something
context['foo'] = 'bar'
return context
<h1>Test</h1>
<h2>{{ foo }}</h2>
<ul>
{% for i in publisher_list %}
<li><a href="{% url show_publisher i.id %}">{{ i.name }}</a></li>
{% endfor %}
</ul>
url(r'book/publisher/(?P<pk>[0-9]+)/$', ShowPublisher.as_view(), name='show_publisher'),
class ShowPublisher(DetailView):
context_object_name = "publisher"
model = Publisher
<h1>Test</h1>
<h2>{{ publisher }}</h2>
class AddPublisher(CreateView):
model = Publisher
success_url = '/book/'
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
class AddPublisher(CreateView):
model = Publisher
success_url = '/book/'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(AddPublisher, self).dispatch(*args, **kwargs)
<h1>Test</h1>
<form method="post" action="./">
{% csrf_token %}
<table>
{{ form }}
</table>
<input type="submit" value="Add" />
</form>
Comment article