custom - xaxis ticks python




Klassenansichten in Django (6)

Django view zeigt auf eine Funktion, die ein Problem sein kann, wenn Sie nur ein bisschen Funktionalität ändern möchten. Ja, ich könnte Millionen Schlüsselwortargumente und noch mehr if-Anweisungen in der Funktion haben, aber ich habe mehr an einen objektorientierten Ansatz gedacht.

Ich habe beispielsweise eine Seite, auf der ein Benutzer angezeigt wird. Diese Seite ähnelt stark der Seite, auf der eine Gruppe angezeigt wird, es ist jedoch nicht so ähnlich, nur ein anderes Datenmodell zu verwenden. Die Gruppe hat auch Mitglieder etc ...

Eine Möglichkeit wäre, Ansichten auf Klassenmethoden zu verweisen und diese Klasse dann zu erweitern. Hat jemand diesen Ansatz ausprobiert oder eine andere Idee?


Es sei denn, Sie möchten etwas etwas Komplexes tun, ist die Verwendung der allgemeinen Ansichten der richtige Weg. Sie sind weitaus leistungsstärker als der Name vermuten lässt, und wenn Sie nur Modelldaten anzeigen, sind generische Ansichten die richtige Wahl.


Ich habe meine eigenen generischen Ansichtsklassen erstellt und verwendet und __call__ definiert, damit eine Instanz der Klasse __call__ kann. Ich mag es wirklich; Während Djangos generische Ansichten einige Anpassungen über Schlüsselwortargumente zulassen, können OO-generische Ansichten (wenn ihr Verhalten in mehrere separate Methoden unterteilt ist) durch Unterklassen viel feiner angepasst werden, wodurch ich mich viel weniger wiederholen kann. (Ich habe es satt, die gleiche Logik für das Erstellen / Aktualisieren von Ansichten immer dann neu zu schreiben, wenn ich etwas optimieren muss, das Djangos generische Ansichten nicht ganz zulassen).

Ich habe Code auf djangosnippets.org gepostet.

Der einzige wirkliche Nachteil, den ich sehe, ist die Zunahme interner Methodenaufrufe, die die Leistung etwas beeinträchtigen können. Ich denke nicht, dass dies ein großes Problem ist. Es ist selten, dass die Ausführung von Python-Code Ihr Leistungsengpass in einer Web-App ist.

UPDATE : Djangos eigene generische Ansichten basieren jetzt auf Klassen.

UPDATE : FWIW, ich habe meine Meinung zu klassenbasierten Ansichten geändert, da diese Antwort geschrieben wurde. Nachdem ich sie in einigen Projekten ausgiebig verwendet habe, tendieren sie meiner Meinung nach dazu, zu Code zu führen, der zufriedenstellend trocken zu schreiben ist, aber sehr schwer zu lesen und später zu warten ist, da die Funktionalität auf so viele verschiedene Stellen verteilt ist und Unterklassen so abhängig sind zu jedem Implementierungsdetail der Superklassen und Mixins. Ich bin jetzt der Meinung, dass TemplateResponse und View Decorators eine bessere Antwort für die Zerlegung von View-Code sind.


In der Regel sind generische Ansichten der richtige Weg, aber letztendlich können Sie URLs nach Belieben bearbeiten. FormWizard führt die Aufgaben klassenbasiert aus, ebenso wie einige Apps für RESTful-APIs.

Grundsätzlich erhalten Sie mit einer URL eine Reihe von Variablen und einen Platz zum Bereitstellen eines aufrufbaren Objekts. Was Sie als aufrufbares Objekt bereitstellen, liegt ganz bei Ihnen - die Standardmethode ist das Bereitstellen einer Funktion -, aber letztendlich schränkt Django Ihre Arbeitsweise nicht ein.

Ich bin damit einverstanden, dass ein paar weitere Beispiele dafür gut wären. Der FormWizard ist wahrscheinlich der Ort, an dem Sie beginnen sollten.


Klingt für mich so, als würden Sie versuchen, Dinge zu kombinieren, die nicht kombiniert werden sollten. Wenn Sie in Ihrer Ansicht unterschiedliche Verarbeitungsschritte ausführen müssen, je nachdem, ob es sich um ein Benutzer- oder Gruppenobjekt handelt, das Sie anzeigen möchten, sollten Sie zwei verschiedene Ansichtsfunktionen verwenden.

Andererseits kann es gebräuchliche Redewendungen geben, die Sie aus Ihren object_detail-Typansichten extrahieren möchten ... Vielleicht könnten Sie einen Dekorateur oder nur Hilfsfunktionen verwenden?

-Dan


Sie können jederzeit eine Klasse erstellen, die Funktion __call__ überschreiben und dann die URL-Datei auf eine Instanz der Klasse verweisen. Sie können einen Blick auf die FormWizard Klasse FormWizard , um zu sehen, wie dies gemacht wird.


Wenn Sie gemeinsame Funktionen für mehrere Seiten verwenden möchten, sollten Sie sich benutzerdefinierte Tags ansehen. Sie sind recht einfach zu erstellen und sehr leistungsfähig.

Vorlagen können auch von anderen Vorlagen abweichen . Auf diese Weise können Sie über eine Basisvorlage verfügen, mit der Sie das Layout der Seite einrichten und diese für andere Vorlagen freigeben können, die die Lücken ausfüllen. Sie können Vorlagen beliebig tief verschachteln. So können Sie das Layout auf verschiedenen Gruppen zusammengehöriger Seiten an einem Ort festlegen.





oop