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 .
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

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).

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))

Die zweite Version mir aussieht:

  • Entspricht der Funktionalität
  • Viel mehr lesbar (self.args[0]? Schrecklich!)
  • Kürzere
  • Nicht weniger DRY-konform

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

.
War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top