Was ist der Vorteil von Class-Based Ansichten?
-
09-10-2019 - |
Frage
Ich lese heute, dass Django 1.3 Alpha ist die Schifffahrt und die am meisten propagiert Neuerung ist die Einführung von klassenbasierte Ansichten . Und nun lassen Sie sie vergleichen Sie es mit einer „plain-old-Ansichten“ Lösung, die von mir in 5 Minuten für diese Frage (Ich entschuldige mich für jeden Fehler, den Sie darin finden können). Die zweite Version mir aussieht: Gibt es etwas Großes ich fehle? Warum sollte ich sie verwenden? Sind die auf der Dokumentation? Wenn ja, dann, was der ideale Anwendungsfall wäre? Sind Mixins das nützlich? Vielen Dank im Voraus für jeden, trägt! P. S für diejenigen, die sich fragen, wurde ich nie von generischen Ansichten als auch begeistert., Sobald ich einige erweiterte Funktionen benötigt, wurden sie nicht kürzer als reguläre Ansichten
Ich habe die entsprechende Dokumentation lesen, aber ich finde schwierig, die Vorteil ™ , dass ich sie mit Hilfe bekommen konnte, so dass hier für etwas Hilfe ich frage sie zu verstehen.
Nehmen wir erweiterte Beispiel href="http://docs.djangoproject.com/en/dev/topics/class-based-views/#viewing-subsets-of-objects"> eines
urls.py
from books.views import PublisherBookListView
urlpatterns = patterns('',
(r'^books/(\w+)/$', PublisherBookListView.as_view()),
)
views.py
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher
class PublisherBookListView(ListView):
context_object_name = "book_list"
template_name = "books/books_by_publisher.html",
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
return Book.objects.filter(publisher=self.publisher)
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherBookListView, self).get_context_data(**kwargs)
# Add in the publisher
context['publisher'] = self.publisher
return context
urls.py
urlpatterns = patterns('books.views',
url(r'^books/(\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)
views.py
from django.shortcuts import get_object_or_404
from books.models import Book, Publisher
def publisher_books_list(request, publisher_name):
publisher = get_object_or_404(Publisher, name__iexact=publisher_name)
book_list = Book.objects.filter(publisher=publisher)
return render_to_response('books/books_by_publisher.html', {
"book_list": book_list,
"publisher": publisher,
}, context_instance=RequestContext(request))
self.args[0]
? Schrecklich!)
Lösung
Sie können eine Klasse, Unterklasse und Raffinationsmethoden wie get_context_data für bestimmte Fälle, und den Rest lassen, wie sie ist. Sie können das nicht mit Funktionen.
Zum Beispiel, müssen Sie eine neue Ansicht erstellen, die alles tut ein früher man tut, aber Sie müssen zusätzliche Variable im Zusammenhang mit einzubeziehen. Subklassen die ursprüngliche Ansicht und überschreibt die get_context_data Methode.
Auch benötigten die Schritte Trennen die Vorlage in einzelne Methoden klaren Code fördert zu machen - die weniger in einem Verfahren durchgeführt, desto leichter ist es zu verstehen. Bei regelmäßigen Blick Funktionen, es ist alles in das Gerät einer Verarbeitung geworfen.
Andere Tipps
Wenn self.args[0]
Sie stört, die Alternative ist:
urlpatterns = patterns('books.views',
url(r'^books/(?P<slug>\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)
Dann könnte man self.kwargs['slug']
stattdessen verwendet, ist es etwas besser lesbar zu machen.
Ihr Beispiel Funktion und Klasse sind in Funktionen, die nicht gleich sind.
Die Klasse basierte Version bietet Paginierung kostenlos und verbietet die Verwendung von anderen HTTP-Verben als GET.
Wenn Sie dies Ihre Funktion hinzufügen möchten, es wird viel länger sein.
Aber es ist in der Tat komplizierter.
Dies ist das erste dieser ich höre - und ich mag es.
Der Vorteil, den ich hier zu sehen, die ehrlich ist, dass es insgesamt mit Django Ansichten konsistenter macht. Alle Modelle sind Klassen, und ich habe immer das Gefühl, dass die Ansichten auch sein sollte. Ich weiß nicht alles, aber Ansichten und Modelle sind die zwei stark frequentierten Typen .
Wie für den technischen Vorteil? Nun, in Python alles ist eine Klasse ( oder Objekt ?) - so ist es wirklich ein Unterschied? Ist es nicht 99% syntaktischen Zucker in erster Linie?
Eine Möglichkeit, über Klasse basierter Ansichten zu denken, ist, dass sie wie ein Django-Admin sind mit Stützrad ab und damit viele flexibler (aber schwieriger zu verstehen).
Zum Beispiel der Listenanzeige im Admin auf dem allgemeinen Listview deutlich basiert. Die einfachste Listenansicht Sie würde nur ein Modell oder queryset definieren.
class MyExampleView(ListView);
model = ExampleModel
Sie müssen Ihre eigene Vorlage liefern, aber es wird im Grunde die gleiche wie die grundlegendsten Modeladmin sein. Das list_display Attribut im Modell Admin wird ihm sagen, was Felder angezeigt werden soll, während in der Listview Sie dies in der Vorlage tun würde.
class SpeciesAdmin(admin.ModelAdmin):
list_display = ['name']
admin.site.register(ExampleModel , ExampleModelAdmin)
Mit dem Admin Sie haben einen Parameter
list_per_page = 100
, die, wie viele Objekte pro Seite definiert. Listenansicht hat
paginate_by = 100
, die das Gleiche erreicht. Ebenso, wenn Sie das Admin stark aussehen in Customizing, werden Sie eine Menge Überschneidungen sehen.
Diese Seite hier sollen Sie eine bessere Vorstellung davon, was sie auch tun.