Klassenbasierte Ansichten VS Funktionsbasierte Ansichten

73

Ich verwende beim Erstellen einer Django-App immer FBVs (Function Based Views), da diese sehr einfach zu handhaben sind. Die meisten Entwickler sagten jedoch, dass es besser ist, CBVs (Class Based Views) zu verwenden und nur FBVs zu verwenden, wenn es sich um komplizierte Ansichten handelt, deren Implementierung mit CBVs schwierig wäre.

Warum? Was sind die Vorteile der Verwendung von CBVs?

Catherine
quelle
13
"Die meisten Entwickler"? "Ja wirklich?" Das bezweifle ich eher. Persönlich erkenne ich, dass CBVs in manchen Situationen gut sind, aber ich benutze sie fast nie.
Daniel Roseman
2
Ja, das steht in dem Buch, das ich gelesen habe, aber das weiß ich nicht. Ich benutze FBVs sehr gerne als CBVs.
Catherine
8
@ DanielRoseman Wenn Daniel kein CBV verwendet, höre ich jetzt auf, mir Sorgen zu machen, dass ich CBV nicht kenne und nicht verwende.
Doniyor

Antworten:

77

Der wichtigste Vorteil ist die Vererbung. Bei einem großen Projekt haben Sie wahrscheinlich viele ähnliche Ansichten. Anstatt immer wieder denselben Code zu schreiben, können Sie Ihre Ansichten einfach von einer Basisansicht erben lassen.

Außerdem wird Django mit einer Sammlung allgemeiner Ansichtsklassen geliefert, mit denen einige der häufigsten Aufgaben ausgeführt werden können. Beispielsweise wird die DetailView-Klasse verwendet, um ein einzelnes Objekt von einem Ihrer Modelle zu übergeben, es mit einer Vorlage zu rendern und die http-Antwort zurückzugeben. Sie können es direkt in Ihre URL conf einstecken.

url(r'^author/(?P<pk>\d+)/$', DetailView.as_view(model=Author)),

Oder Sie können es mit benutzerdefinierten Funktionen erweitern

class SpecialDetailView(DetailView):
    model = Author
    def get_context_data(self, *args, **kwargs):
        context = super(SpecialDetailView, self).get_context_data(*args, **kwargs)
        context['books'] = Book.objects.filter(popular=True)
        return context

Jetzt wird Ihrer Vorlage eine Sammlung von Buchobjekten zum Rendern übergeben.

Ein guter Anfang ist ein gutes Lesen der Dokumente .

Aktualisieren

ccbv.co.uk bietet umfassende und benutzerfreundliche Informationen zu den klassenbasierten Ansichten, die Ihnen bereits zur Verfügung stehen.

Aidan Ewen
quelle
3
@meshy Ein Domainname für cbv, jemand muss cbv wirklich lieben!
NeoWang
1
Der docs Link ist tot, sollte docs.djangoproject.com/de/1.9/topics/class-based-views sein
Tanner
Wow - das ist schade, dass sie die 1.4-Dokumentation getötet haben - ich habe regelmäßig auf Dokumente verlinkt - die Versionsnummer beibehalten, um sicherzustellen, dass die Antwort korrekt bleibt. Wie auch immer, danke @Tanner - ich habe diese Antwort aktualisiert.
Aidan Ewen
1
@AidanEwen Ich habe einige Leute gesehen, die auf die Entwicklerversion verlinken: djangoproject.com/de/dev/topics/blah
Tanner
17

Als ich mit DJango anfing, habe ich CBVs wegen ihrer Lernkurve und ihrer etwas komplexen Struktur nie verwendet. Schneller Vorlauf über zwei Jahre, ich benutze FBVs nur an wenigen Stellen. Wo ich sicher bin, dass der Code wirklich einfach sein wird und einfach bleiben wird.

Der Hauptvorteil von CBVs und der damit verbundenen Mehrfachvererbung besteht darin, dass ich das Schreiben von Signalen, Hilfsmethoden und das Kopieren und Einfügen von Code vollständig vermeiden kann. Besonders in den Fällen, in denen die App viel mehr als nur grundlegende CRUD-Operationen ausführt. Ansichten mit Mehrfachvererbung sind um ein Vielfaches einfacher zu debuggen als ein Code mit Signalen und Hilfsmethoden, insbesondere wenn es sich um eine unbekannte Codebasis handelt.

Abgesehen von CBVs mit Mehrfachvererbung bieten sie verschiedene Methoden zum Versenden, Abrufen von Vorlagen, Behandeln verschiedener Anforderungstypen, Übergeben von Vorlagenkontextvariablen, Überprüfen von Formularen und vieles mehr. Diese machen Code modular und damit wartbar.

iankit
quelle
14

EINIGE WÖRTER VON ZWEI SCHAUFELN

Tipp Alternativer Ansatz - Bei FBVs bleiben

Einige Entwickler bevorzugen es, FBVs für die meisten Ansichten und CBVs nur für Ansichten zu verwenden, die in Unterklassen unterteilt werden müssen. Diese Strategie ist auch in Ordnung.

GrvTyagi
quelle
11

Einige Ansichten werden am besten als CBVs implementiert, andere am besten als FBVs.

Wenn Sie sich nicht sicher sind, welche Methode Sie wählen sollen, sehen Sie sich die folgende Tabelle an:

Geben Sie hier die Bildbeschreibung ein

Milad Hatami
quelle
8

Klassenbasierte Ansichten eignen sich hervorragend, wenn Sie voll funktionsfähige CRUD-Operationen implementieren möchten in Ihrer Django-Anwendung Implementierung funktionsbasierter Ansichten erfordert wenig Zeit und Mühe.

Ich empfehle Ihnen, funktionsbasierte Ansichten zu verwenden, wenn Sie keine CRUD auf Ihrer Site / Anwendung implementieren möchten. Dies bedeutet, dass Sie die Vorlage einfach rendern möchten.

Ich hatte eine einfache CRUD- basierte Anwendung mit klassenbasierten Ansichten erstellt, die live ist. Besuchen Sie http://filtron.pythonanywhere.com/view/ (wird / wird jetzt nicht funktionieren) und genießen Sie. Dann werden Sie wissen, wie wichtig es ist.

Hygull
quelle