Djangos Generic-Views: Wann ListView vs. Detailansicht
Bin ich mit Django s, class based generic views in einer blog-Anwendung. Eine meiner Ansichten-zeigt eine Liste der Beiträge mit einem bestimmten tag. Ich kann schreiben, diese Ansicht als ListView
Beiträge gefiltert nach tag. Oder ich kann schreiben, diese Ansicht als DetailView
des Tags, und fügen Sie die entsprechenden Beiträge auf den Kontext.
Ist eine Möglichkeit, mehr richtig-oder Pythonic -- als die anderen?
Den ListView
Ansatz scheint mehr semantische, denn was ich will ist ein Liste posts, aber es ist auch etwas komplexer. Es erfordert, dass ich überschreiben der beiden Methoden. Die DetailView
Ansatz erfordert nur mich zu überschreiben einer Methode.
class PostTagView(ListView):
"""Display all blog posts with a given tag."""
queryset = Post.objects.published()
def get_context_data(self, **kwargs):
context = super(PostTagView, self).get_context_data(**kwargs)
context['tag'] = get_object_or_404(Tag, slug=self.kwargs['slug'])
return context
def get_queryset(self, **kwargs):
queryset = super(PostTagView, self).get_queryset()
return queryset.filter(tags__slug=self.kwargs['slug'])
class TagDetailView(DetailView):
"""Display all blog posts with a given tag."""
model = Tag
def get_context_data(self, **kwargs):
context = super(TagDetailView, self).get_context_data(**kwargs)
context['object_list'] = Post.objects.published().filter(tags__slug=self.kwargs['slug'])
return context
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Faustregel gilt, betrachten Sie die Parameter in der URL. Wenn Sie eine
slug
einerTag
dann sind Sie wahrscheinlich Umgang mit einemDetailView
und nicht einListView
.In diesem Fall wird der zweite Ansatz verwendet weniger code und es ist mehr elegant. Aber es hängt auch davon ab, was du gehst zu tun, mit der Aussicht später auf. Wenn Sie zum hinzufügen von Formen zu Bearbeiten, die Beiträge, mag es Sinn machen, verwenden Sie eine
ListView
statt. Aber es gibt keinen technischen Grund, Sie bevorzugen einen über den anderen, es ist nur, dass Sie könnten am Ende mehr code schreiben, in einem Ansatz als in der anderen.DetailView
sollte nicht paginiert sein, es ist bestimmt ein Objekt nur.MultipleObjectMixin
, um IhreDetailView
, das ermöglicht die Wiederverwendung von Paginierung. Sie müssen nur sicherstellenself.object_list
ist auf das queryset der gefilterten Objekte, die Sie möchten, um zu paginieren.Interessante Frage. Leider ist die Antwort nicht ganz so interessant: je nachdem, was am meisten Sinn macht für Sie und Ihre app. Argumente können gemacht werden, ebenso für einen der beiden Ansätze, also ist es wirklich nur ein Urteil-Aufruf.
Beide Listenansicht und Detailansicht sind nicht das gleiche, technisch,
Zum Beispiel können Sie nicht geben Sie den Pfad für eine Detailansicht wie die unten in urls.py,
Dadurch erhalten die folgende Fehlermeldung,
Dies bedeutet, dass, wenn wir eine Tabelle namens Studenten und eine weitere Tabelle mit dem Namen der Schule, die wir verwenden können, das ListView, um eine Liste der Schulen, wie unten
Und wenn wir wollen, um eine Liste der Schulen, die details für eine einzelne Schule, wenn wir auf die school-Symbol, dann können wir den Primärschlüssel der Schule, die Django schafft intern und erfassen es in der url-Muster, in meinem Fall die url-Muster wäre "Liste/{{Schule.id}}" so zu erfassen, müssen wir den Pfad wie unten für die DetailsView,
Also Bottom line ist, können Sie den ListView als eine normale Ansicht für die meisten Fälle, wenn Sie wollen, dass andere sehen, sondern nur ein bestimmtes detail in dieser Ansicht, die sich mit einem Primärschlüssel dann können Sie eine Detailansicht(die url-Muster für die Detailansicht generiert werden, indem der primary key-info in der url, ohne primary key in der url, es wird nicht funktionieren, da es nicht alle Infos, sondern es wird nur nehmen Sie die info in Bezug auf die primären Schlüssel in der url)
Den Anwendungsfall für das class based generic views sind perfekt beschrieben im Artikel:
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Generic_views
Im oben genannten Artikel, Sie wäre in der Lage zu wissen, Wann/warum und wie zu verwenden Listenansicht/Detailansicht zusammen mit einfachen Beispielen.