{"id":577123,"date":"2025-06-23T05:21:13","date_gmt":"2025-06-23T04:21:13","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=pycharm&#038;p=577123"},"modified":"2025-06-23T05:21:23","modified_gmt":"2025-06-23T04:21:23","slug":"einfuehrung-in-django-views","status":"publish","type":"pycharm","link":"https:\/\/blog.jetbrains.com\/de\/pycharm\/2025\/06\/einfuehrung-in-django-views\/","title":{"rendered":"Einf\u00fchrung in Django-Views"},"content":{"rendered":"<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-540837\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/06\/PC-social-BlogFeatured-1280x720-2x-22.png\" alt=\"Einf\u00fchrung in Django-Views\" width=\"2560\" height=\"1440\" \/><\/figure>\n<p>Views (Ansichten) sind ein wesentlicher Bestandteil des Django-Architekturkonzepts und es ist f\u00fcr Framework-Entwickler*innen entscheidend, ein fundiertes Wissen \u00fcber den Umgang mit ihnen zu haben. Wenn Sie erst mit der Entwicklung von Web-Apps mittels Django beginnen oder eine Auffrischung zu Views ben\u00f6tigen, sind Sie hier genau richtig.<\/p>\n<p>Ein besseres Verst\u00e4ndnis von Views wird Ihnen helfen, in Ihrem Django-Projekt schneller voranzukommen. Ganz gleich, ob Sie an einem API-Backend oder an Web-UI-Flows arbeiten: Das Wissen um den Einsatz von Views ist entscheidend.<\/p>\n<p>Lesen Sie weiter, um zu erfahren, was Django Views sind, welche verschiedenen Arten es gibt, welche Best Practices f\u00fcr die Arbeit mit ihnen zu beachten sind und welche Anwendungsf\u00e4lle es gibt.<\/p>\n<h2 class=\"wp-block-heading\">Was sind Django Views?<\/h2>\n<p>Views sind eine Kernkomponente des MTV-Architekturkonzepts (Model-Template-View) von Django. Sie fungieren im Wesentlichen als Vermittler zwischen <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/topics\/db\/models\/\" target=\"_blank\" rel=\"noopener\">Models (Modellen)<\/a> und <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/02\/the-ultimate-guide-to-django-templates\/\" data-type=\"link\" data-id=\"https:\/\/blog.jetbrains.com\/pycharm\/2025\/02\/the-ultimate-guide-to-django-templates\/\">Templates (Vorlagen)<\/a>, die Anfragen von Benutzer*innen verarbeiten und Antworten zur\u00fcckgeben.<\/p>\n<p>Vielleicht sind Ihnen Views im Rahmen des MVC-Konzepts (Model-View-Controller) bereits untergekommen. Diese <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/faq\/general\/#faq-mtv\" target=\"_blank\" rel=\"noopener\">unterscheiden sich jedoch leicht von Views in Django<\/a> und lassen sich nicht direkt als solche abbilden. Django Views sind im Wesentlichen Controller in MVC, w\u00e4hrend Django Templates in etwa mit Views in MVC \u00fcbereinstimmen. Daher ist es wichtig, die Nuancen von Django Views zu verstehen, selbst wenn Sie mit Views im MVC-Kontext vertraut sind.<\/p>\n<p>Views sind Teil der Bedienschnittstelle in Django. Sie \u00fcbernehmen die Logik und die Datenverarbeitung f\u00fcr Webanfragen, die an Ihre Django-basierten Apps und Websites gestellt werden. Sie setzen Ihre Templates in das um, was Benutzer*innen sehen, wenn sie Ihre Webseite aufrufen. Jede funktions- oder klassenbasierte View nimmt die Anfragen von Benutzer*innen entgegen, ruft die Daten aus den entsprechenden Modellen ab, wendet Gesch\u00e4ftslogik oder Datenverarbeitung an und bereitet dann eine HTTP-Antwort vor, welche an die Template zur\u00fcckgegeben wird.<\/p>\n<p>Diese R\u00fcckmeldung kann jegliche Art von Inhalten enthalten, die ein Webbrowser darstellt \u2013 in der Regel ist es eine HTML-Webseite. Django Views k\u00f6nnen jedoch auch Bilder, XML-Dokumente, Weiterleitungen, Fehlerseiten und mehr zur\u00fcckgeben.<\/p>\n<h2 class=\"wp-block-heading\">Rendering und \u00dcbergabe von Daten an Templates<\/h2>\n<p>Django stellt den Kurzbefehl <code>render()<\/code> zur Verf\u00fcgung, um das Rendern von Templates innerhalb von Views zu vereinfachen. Wenn Sie <code>render()<\/code> verwenden, vermeiden Sie das Laden der Vorlage und die manuelle Erstellung der Antwort.<\/p>\n<p>PyCharm bietet intelligente Code-Completion, die automatisch die Funktion <code>render()<\/code> aus <code>django.shortcuts<\/code> vorschl\u00e4gt, wenn Sie mit der Eingabe in Ihren Views beginnen. Sie erkennt auch Template-Namen und bietet Auto-Completion f\u00fcr Template-Pfade, sodass Sie Tippfehler und Versehen vermeiden k\u00f6nnen.<\/p>\n<p>Benutzer*innen geben die Anfrage, den Namen der Template und ein Kontext-W\u00f6rterbuch an, das die Daten f\u00fcr die Template enth\u00e4lt. Sobald die erforderlichen Daten vorliegen, \u00fcbergibt die View sie an die Template, wo sie gerendert und den Benutzer*innen pr\u00e4sentiert werden k\u00f6nnen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.shortcuts import render\n\ndef my_view(request):\n    # Some business logic to obtain data\n    data_to_pass = {'variable1': 'value1', 'variable2': 'value2'}\n\n    # Pass the data to the template\n    return render(request, 'my_template.html', context=data_to_pass)<\/pre>\n<p>In diesem Beispiel ist <code>data_to_pass<\/code> ein W\u00f6rterbuch, das die Daten enth\u00e4lt, welche Sie an die Template senden m\u00f6chten. Die Funktion <code>render<\/code> wird dann zum Rendern der Template (<code>my_template.html<\/code>) mit den bereitgestellten Kontextdaten verwendet.<\/p>\n<p>Jetzt k\u00f6nnen Sie in Ihrer Template (<code>my_template.html<\/code>) auf die Daten zugreifen und sie anzeigen.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n    <\/pre>\n<h1>{{ variable1 }}<\/h1>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"html\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n\n    \n{{ variable2 }}\n\n<\/pre>\n<p>In der Template verwenden Sie doppelte geschweifte Klammern (<code>{{ }}<\/code>), um die entsprechenden Variablen zu kennzeichnen. Diese werden durch die Werte aus den von der View \u00fcbergebenen Kontextdaten ersetzt.<\/p>\n<p><a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/web-development\/django\/\" target=\"_blank\" rel=\"noopener\">PyCharm<\/a> bietet Completion und Syntaxhervorhebung f\u00fcr Django-Template-Tags, -Variablen und -Schleifen. Au\u00dferdem bietet das Tool Linting im Editor zur Beseitigung h\u00e4ufiger Fehler. So k\u00f6nnen Sie sich auf die Erstellung von Views und die Verarbeitungslogik konzentrieren, anstatt Zeit mit dem manuellen Ausf\u00fcllen von Template-Elementen oder dem Debuggen g\u00e4ngiger Versehen zu verbringen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-540786\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/1-1.png\" alt=\"Django-Completion in PyCharm\" width=\"3840\" height=\"2160\" \/><\/figure>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/web-development\/django\/\" target=\"\" rel=\"noopener\">Starten Sie mit PyCharm Pro kostenlos durch<\/a><\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Funktionsbasierte Views<\/h2>\n<p>Django bietet zwei Arten von Views: funktionsbasierte und klassenbasierte.<\/p>\n<p>Funktionsbasierte Views werden mit einfachen Python-Funktionen erstellt und sind im Allgemeinen in vier grundlegende Kategorien unterteilt: Erstellen, Lesen, Aktualisieren und L\u00f6schen (CRUD). Dies ist die Grundlage eines jeden Entwicklungsframeworks. Sie nehmen eine HTTP-Anfrage entgegen und geben eine HTTP-Antwort zur\u00fcck.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.http import HttpResponse\n\ndef my_view(request):\n\n    # View logic goes here\n    context = {\"message\": \"Hello world\"}\n\n    return HttpResponse(render(request, \"mytemplate.html\", context))<\/pre>\n<p>Dieser Ausschnitt verarbeitet die View-Logik, bereitet ein Kontextw\u00f6rterbuch f\u00fcr die \u00dcbergabe von Daten an eine Template vor, die gerendert wird, und gibt den endg\u00fcltigen HTML-Text der Template in einem Antwortobjekt zur\u00fcck.<\/p>\n<p>Funktionsbasierte Views sind einfach und \u00fcberschaubar. Die Logik wird in einer einzigen Python-Funktion abgedeckt und nicht \u00fcber Methoden in einer Klasse verteilt, wodurch sie sich am besten f\u00fcr Anwendungsf\u00e4lle mit minimaler Verarbeitung eignen.<\/p>\n<p>PyCharm erm\u00f6glicht Ihnen die automatische Generierung von <code>def my_view(request)<\/code>-Strukturen mit <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/using-live-templates.html\" target=\"_blank\" rel=\"noopener\">Live-Vorlagen<\/a>. Live-Vorlagen sind vorab definierte Codeausschnitte, die zu Textbaustein-Code erweitert werden k\u00f6nnen. Dieses Feature spart Ihnen Zeit und gew\u00e4hrleistet eine konsistente Struktur f\u00fcr Ihre View-Definitionen.<\/p>\n<p>Sie k\u00f6nnen Live-Vorlagen einfach aufrufen, indem Sie <em>\u2318J<\/em> dr\u00fccken, <code>Listview<\/code> eingeben und die Tabulatortaste bet\u00e4tigen.<\/p>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/2.mov\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<p>Au\u00dferdem gibt es in PyCharm das Toolfenster <em>Django Structure<\/em> (Django-Struktur), in dem Sie geordnet nach App eine Liste aller Views in Ihrem Django-Projekt sehen k\u00f6nnen. So k\u00f6nnen Sie Views schnell finden, zwischen ihnen navigieren und feststellen, zu welcher Datei die jeweilige View geh\u00f6rt.<\/p>\n<figure class=\"wp-block-video\"><video src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/3.mov\" controls=\"controls\" width=\"300\" height=\"150\"><\/video><\/figure>\n<h2 class=\"wp-block-heading\">Klassenbasierte Views<\/h2>\n<p>Django hat klassenbasierte Views eingef\u00fchrt, damit Benutzer*innen nicht immer wieder denselben Code schreiben m\u00fcssen. Sie ersetzen funktionsbasierte Views nicht, sondern haben bestimmte Anwendungsbereiche und Vorteile, insbesondere in F\u00e4llen, in denen komplexe Logik erforderlich ist.<\/p>\n<p>Klassenbasierte Views in Django bieten wiederverwendbare \u00fcbergeordnete Klassen, die verschiedene Muster und Funktionen implementieren, welche typischerweise f\u00fcr Views in Webanwendungen ben\u00f6tigt werden. Sie k\u00f6nnen Ihre Views aus diesen \u00fcbergeordneten Klassen \u00fcbernehmen, um Boilerplate-Code zu reduzieren.<\/p>\n<p>Klassenbasierte Views bieten generische \u00fcbergeordnete Klassen wie:<\/p>\n<ul>\n<li><code>ListView<\/code><\/li>\n<li><code>DetailView<\/code><\/li>\n<li><code>CreateView<\/code><\/li>\n<li>Und vieles mehr.<\/li>\n<\/ul>\n<p>Im Folgenden finden Sie zwei \u00e4hnliche Codeausschnitte, die eine einfache <code>BookListView<\/code> darstellen. Der erste zeigt eine grundlegende Implementierung unter Verwendung der standardm\u00e4\u00dfigen klassenbasierten Konventionen, w\u00e4hrend der zweite veranschaulicht, wie Sie die View durch Angabe zus\u00e4tzlicher Parameter anpassen k\u00f6nnen.<\/p>\n<p><strong>Grundlegende Implementierung<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import ListView\nfrom .models import Book \n\nclass BookListView(ListView):\n    model = Book\n    # The template_name is omitted because Django defaults to 'book_list.html' \n    # based on the convention of _list.html for ListView.<\/pre>\n<p>Wenn <code>BookListView<\/code> gerendert wird, fragt der Code automatisch die Book<strong>&#8211;<\/strong>Datens\u00e4tze ab und \u00fcbergibt sie unter der Variablen books beim Rendern an <code>book_list.html<\/code>. Das bedeutet, dass Sie schnell eine View zur Auflistung von Objekten erstellen k\u00f6nnen, ohne die zugrunde liegende Logik umschreiben zu m\u00fcssen.<\/p>\n<p><strong>Angepasste Implementierung<\/strong>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import ListView\nfrom .models import Book \n\nclass BookListView(ListView):\n\n    model = Book\n\t# You can customize the view further by adding additional attributes or methods \n    def get_queryset(self):\n\t# Example of customizing the queryset to filter books\n\treturn Book.objects.filter(is_available=True)<\/pre>\n<p>Im zweiten Ausschnitt haben wir die angepasste Methode <code>get_queryset()<\/code> eingef\u00fchrt, mit der wir die in der View angezeigten Datens\u00e4tze genauer filtern k\u00f6nnen. Dies demonstriert, wie klassenbasierte Views \u00fcber ihre Standardfunktionalit\u00e4t hinaus erweitert werden k\u00f6nnen, um den Anforderungen Ihrer Anwendung gerecht zu werden.<\/p>\n<p>In klassenbasierten Views werden auch Methoden definiert, die mit wichtigen Teilen des Anfrage- und Antwortlebenszyklus verkn\u00fcpft sind, z. B:<\/p>\n<ul>\n<li><code>get()<\/code> \u2013 Logik f\u00fcr <code>GET<\/code> -Anfragen.<\/li>\n<li><code>post()<\/code> \u2013 Logik f\u00fcr <code>POST <\/code>-Anfragen.<\/li>\n<li><code>dispatch()<\/code> \u2013 bestimmt, ob die Methode <code>get()<\/code> oder <code>post()<\/code> aufgerufen werden soll.<\/li>\n<\/ul>\n<p>Diese Arten von Views sorgen f\u00fcr Struktur und bieten gleichzeitig die M\u00f6glichkeit, sie bei Bedarf anzupassen, wodurch sie sich gut f\u00fcr komplexe Anwendungsf\u00e4lle eignen.<\/p>\n<p>PyCharm verf\u00fcgt \u00fcber Live-Vorlagen f\u00fcr klassenbasierte Views wie <code>ListView<\/code>, <code>DetailView<\/code> und <code>TemplateView<\/code>, mit denen Sie in Sekundenschnelle komplette View-Klassen mit Textbaustein-Methoden und Docstrings erstellen k\u00f6nnen.<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-540822\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/01\/4.png\" alt=\"Django-Live-Vorlagen in PyCharm\" width=\"3840\" height=\"2160\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Erstellen angepasster klassenbasierter Views<\/h3>\n<p>Sie k\u00f6nnen auch Ihre eigenen View-Klassen erstellen, indem Sie die generischen Klassen von Django unterklassifizieren und sie an Ihre Bed\u00fcrfnisse anpassen.<\/p>\n<p>Einige Anwendungsf\u00e4lle, in denen Sie wom\u00f6glich Ihre eigenen Klassen erstellen m\u00f6chten, sind folgende:<\/p>\n<ul>\n<li>Hinzuf\u00fcgen von Gesch\u00e4ftslogik, z.\u00a0B. komplizierte Berechnungen.<\/li>\n<li>Kombinieren mehrerer generischer \u00fcbergeordneter Teile zur Erweiterung der Funktionalit\u00e4t.<\/li>\n<li>Verwaltung von Sitzungen oder Status \u00fcber mehrere Anfragen hinweg.<\/li>\n<li>Optimieren des Datenbankzugriffs mit individuellen Anfragen.<\/li>\n<li>Wiederverwendung gemeinsamer Rendering-Logik in verschiedenen Bereichen.<\/li>\n<\/ul>\n<p>Eine angepasste klassenbasierte View k\u00f6nnte wie folgt aussehen:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.views.generic import View\nfrom django.shortcuts import render\nfrom . import models\n\nclass ProductSalesView(View):\n\n    def get(self, request):\n     \n        # Custom data processing \n        sales = get_sales_data()\n        \n        return render(request, \"sales.html\", {\"sales\": sales})\n\n    def post(self, request):\n\n        # Custom form handling\n        form = SalesSearchForm(request.POST)  \n        if form.is_valid():\n            results = models.Sale.objects.filter(date__gte=form.cleaned_data['start_date'])\n            context = {\"results\": results}\n            return render(request, \"search_results.html\", context)\n            \n        # Invalid form handling\n        errors = form.errors\n        return render(request, \"sales.html\", {\"errors\": errors})<\/pre>\n<p>Mit den angepassten <code>get-<\/code> und <code>post-<\/code>Handlern k\u00f6nnen Sie die vorhandenen zwischen den Anfragen erweitern.<\/p>\n<h2 class=\"wp-block-heading\">Einsatzbereiche der View-Arten<\/h2>\n<p>Funktionsbasierte und klassenbasierte Views k\u00f6nnen je nach Logikkomplexit\u00e4t und -bedarf beide n\u00fctzlich sein.<\/p>\n<p>Die Hauptunterschiede sind, dass klassenbasierte Ansichten \u2026:<\/p>\n<ul>\n<li>\u2026 die Wiederverwendung durch Unterklassifizierung und Vererbung des Verhaltens der \u00fcbergeordneten Teile f\u00f6rdern.<\/li>\n<li>\u2026 sich ideal f\u00fcr die Statusverwaltung zwischen Anfragen eignen.<\/li>\n<li>\u2026 f\u00fcr mehr Struktur und erzwungene Disziplin sorgen.<\/li>\n<\/ul>\n<p>Sie k\u00f6nnen sie etwa in folgenden Bereichen verwenden:<\/p>\n<ul>\n<li>Dashboard-Seiten mit komplexer Rendering-Logik.<\/li>\n<li>\u00f6ffentlich zug\u00e4ngliche Seiten, die dynamische Daten anzeigen.<\/li>\n<li>Admin-Portale f\u00fcr die Inhaltsverwaltung.<\/li>\n<li>Listen- oder Detailseiten mit Datenbankmodellen.<\/li>\n<\/ul>\n<p>Auf der anderen Seite sind funktionsbasierte Views \u2026:<\/p>\n<ul>\n<li>\u2026 einfacher und sie ben\u00f6tigen weniger Code.<\/li>\n<li>\u2026 f\u00fcr Python-Entwickler*innen unter Umst\u00e4nden leichter zu verstehen.<\/li>\n<li>\u2026 sehr flexibel und sie unterliegen weniger Beschr\u00e4nkungen.<\/li>\n<\/ul>\n<p>Ihre Anwendungsf\u00e4lle umfassen:<\/p>\n<ul>\n<li>Prototyping von Ideen.<\/li>\n<li>einfache CRUD- oder Datenbankansichten.<\/li>\n<li>Landing- oder Marketingseiten.<\/li>\n<li>API-Endpunkte f\u00fcr die Bearbeitung von Webanfragen.<\/li>\n<\/ul>\n<p>Zusammenfassend sind funktionsbasierte Views anpassungsf\u00e4hig, unkompliziert und leichter zu verstehen. F\u00fcr komplexere F\u00e4lle m\u00fcssen Sie jedoch mehr Code schreiben, den Sie nicht wiederverwenden k\u00f6nnen.<\/p>\n<p>Klassenbasierte Views in Django erzwingen Struktur und sind wiederverwendbar, aber sie k\u00f6nnen schwieriger zu verstehen sowie zu implementieren sein und sind auch schwieriger zu debuggen.<\/p>\n<h2 class=\"wp-block-heading\">Views und URLs<\/h2>\n<p>Wie wir bereits festgestellt haben, sind Views in Django die Funktionen oder Klassen, die bestimmen, wie eine Template gerendert wird. Jede View verweist auf ein bestimmtes URL-Muster und leitet eingehende Anfragen an die richtige Stelle.<\/p>\n<p>Es ist wichtig, die Verbindung zwischen Views und URLs zu verstehen, um den Ablauf Ihrer Anwendung effektiv zu steuern.<\/p>\n<p>Jede View entspricht einem URL-Muster, das in der Datei <code>urls.py<\/code> Ihrer Django-App definiert ist. Diese URL-Zuordnung stellt sicher, dass Django genau wei\u00df, welche View aufgerufen werden soll, wenn Benutzer*innen zu einer bestimmten Adresse in Ihrer Anwendung navigieren.<\/p>\n<p>Werfen wir einen Blick auf eine einfache URL-Konfiguration:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">from django.urls import path\nfrom .views import BookListView\n\nurlpatterns = [\n    path('books\/', BookListView.as_view(), name='book-list'),\n]<\/pre>\n<p>Wenn Benutzer*innen in diesem Beispiel <code>\/books\/<\/code> aufrufen, wird <code>BookListView<\/code> angesprochen, um die Liste der B\u00fccher zu rendern. Indem Sie die URLs eindeutig den Views zuordnen, machen Sie Ihre Codebasis \u00fcbersichtlicher und verbessern deren Organisation.<\/p>\n<h3 class=\"wp-block-heading\">URL-Verwaltung mithilfe von PyCharm vereinfachen<\/h3>\n<p>Die Verwaltung und Visualisierung von Endpunkten in Django kann zu einer Herausforderung werden, wenn Ihre Anwendung w\u00e4chst. PyCharm l\u00f6st dieses Problem mit dem Toolfenster <em>Endpoints <\/em>(Endpunkte), das eine zentrale Ansicht aller URL-Muster, verkn\u00fcpften Views und HTTP-Methoden Ihrer App bietet. Mit diesem Feature k\u00f6nnen Sie sich eine Liste aller Endpunkte in Ihrem Projekt anzeigen lassen, sodass Sie leichter nachvollziehen k\u00f6nnen, welche Views mit bestimmten URLs verbunden sind.<\/p>\n<p>Anstatt mehrere <code>urls.py<\/code>-Dateien zu durchsuchen, k\u00f6nnen Sie die entsprechenden Views mit nur einem Klick sofort finden und aufrufen. Dies ist besonders n\u00fctzlich f\u00fcr gr\u00f6\u00dfere Django-Projekte, bei denen sich die URL-Konfigurationen \u00fcber mehrere Dateien erstrecken, oder bei der Arbeit in Teams, wo es wichtig ist, den Kontext schnell zu erfassen.<\/p>\n<p>Au\u00dferdem k\u00f6nnen Sie mit dem Toolfenster <em>Endpoints <\/em>alle Endpunkte in einer tabellen\u00e4hnlichen Schnittstelle anzeigen lassen. Jede Zeile stellt den URL-Pfad, die HTTP-Methode (<code>GET<\/code>, <code>POST<\/code> usw.) sowie die zugeh\u00f6rige View-Funktion oder -Klasse eines bestimmten Endpunkts dar.<\/p>\n<p>Dieses Feature steigert nicht nur die Produktivit\u00e4t, sondern verbessert auch die Code-Navigation. So k\u00f6nnen Sie fehlende oder doppelte URL-Muster ganz einfach erkennen. Diese Transparenz ist von unsch\u00e4tzbarem Wert, wenn es darum geht, Routing-Probleme zu debuggen oder neue Entwickler*innen in ein Projekt einzubinden.<\/p>\n<p>Sehen Sie sich dieses Video an, um mehr \u00fcber das Toolfenster <em>Endpoints<\/em> und dessen Nutzen f\u00fcr Sie zu erfahren.<\/p>\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\">\n<div class=\"wp-block-embed__wrapper\">\u00a0<\/div>\n<\/figure>\n<h2 class=\"wp-block-heading\">Best Practices f\u00fcr die Verwendung von Django Views<\/h2>\n<p>Im Folgenden finden Sie einige Richtlinien, die Ihnen bei der Erstellung gut strukturierter und wartungsf\u00e4higer Views helfen k\u00f6nnen.<\/p>\n<h3 class=\"wp-block-heading\">Klar strukturierte Views<\/h3>\n<p>Views sollten sich auf die Bearbeitung von Anfragen, das Abrufen von Daten, die \u00dcbergabe von Daten an Templates sowie die Steuerung des Ablaufs und von Umleitungen konzentrieren. Komplizierte <a href=\"https:\/\/forum.djangoproject.com\/t\/where-to-put-business-logic-in-django\/282\" target=\"_blank\" rel=\"noopener\">Gesch\u00e4ftslogik<\/a> und komplexe Verarbeitungen sollten an anderer Stelle stattfinden, z.\u00a0B. in Model-Methoden oder speziellen Serviceklassen.<\/p>\n<p>Sie sollten jedoch darauf achten, Ihre Models nicht mit zu viel Logik zu \u00fcberladen, da dies in Django zu einem \u201eFat Model\u201c-Anti-Pattern f\u00fchren kann. <a href=\"https:\/\/docs.djangoproject.com\/en\/5.1\/topics\/class-based-views\/\" target=\"_blank\" rel=\"noopener\">In der Django-Dokumentation zu Views<\/a> finden Sie weitere Erkenntnisse zur richtigen Strukturierung derselben.<\/p>\n<h3 class=\"wp-block-heading\">\u00dcberschaubare Views und Templates<\/h3>\n<p>Es ist ratsam, sowohl Views als auch Templates schlank zu gestalten. Views sollten die Verarbeitung von Anfragen und den Abruf von Daten \u00fcbernehmen, w\u00e4hrend Templates sich auf die Pr\u00e4sentation mit minimaler Logik konzentrieren.<\/p>\n<p>Komplexe Verarbeitungen sollten in Python au\u00dferhalb der Templates durchgef\u00fchrt werden, um die Wartungsf\u00e4higkeit und Testvorg\u00e4nge zu optimieren. Mehr dazu finden Sie in der <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/templates\/\" target=\"_blank\" rel=\"noopener\">Dokumentation zu Django Templates<\/a>.<\/p>\n<h3 class=\"wp-block-heading\">Entkopplung von Datenbankabfragen<\/h3>\n<p>Es ist vorteilhaft, Datenbankabfragen in eigene Model-Manager oder Repositorys zu verlagern, anstatt sie direkt in Views zu integrieren, um Wiederholungen zu vermeiden. In der <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/db\/models\/\" target=\"_blank\" rel=\"noopener\">Dokumentation zu Django Models<\/a> finden Sie Hinweise zur effektiven Verwaltung von Datenbankinteraktionen.<\/p>\n<h3 class=\"wp-block-heading\">Bevorzugung generischer klassenbasierter Views<\/h3>\n<p>Die generischen klassenbasierten Views von Django, etwa <code>DetailView<\/code> und <code>ListView<\/code>, sind wiederverwendbar, ohne dass Sie viel Code schreiben m\u00fcssen. Nutzen Sie sie, anstatt das Rad neu zu erfinden, um Ihre Arbeit effizienter zu gestalten. Die <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/class-based-views\/generic-display\/\" target=\"_blank\" rel=\"noopener\">Dokumentation zu generischen Views<\/a> ist eine hervorragende Ressource, um ein besseres Verst\u00e4ndnis f\u00fcr diese Funktionen zu erlangen.<\/p>\n<h3 class=\"wp-block-heading\">Eignung funktionsbasierter Views f\u00fcr simple Anwendungsf\u00e4lle<\/h3>\n<p>Bei einfachen Views wie f\u00fcr das Bereitstellen von APIs ist eine Funktion m\u00f6glicherweise effektiver als eine Klasse. Nutzen Sie komplexe klassenbasierte Views nur f\u00fcr ausgekl\u00fcgelte UI-Abl\u00e4ufe. Die <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/http\/views\/\" target=\"_blank\" rel=\"noopener\">Dokumentation zur Entwicklung von Views<\/a> bietet hilfreiche Beispiele.<\/p>\n<h3 class=\"wp-block-heading\">Saubere Strukturierung von Routen und URLs<\/h3>\n<p>Organisieren Sie Routen und View-Handler, indem Sie diese nach Funktionalit\u00e4t in Apps gruppieren. Das erleichtert das Auffinden und Navigieren im Quellcode. In der <a href=\"https:\/\/docs.djangoproject.com\/en\/stable\/topics\/http\/urls\/\" target=\"_blank\" rel=\"noopener\">Django-URL-Dispatcher-Dokumentation<\/a> finden Sie Best Practices f\u00fcr die Strukturierung Ihrer URL-Konfigurationen.<\/p>\n<h2 class=\"wp-block-heading\">N\u00e4chste Schritte<\/h2>\n<p>Da Sie nun die Grundlagen zu Views in Django kennen, sollten Sie sich intensiver mit dem Framework und den n\u00e4chsten Schritten besch\u00e4ftigen.<\/p>\n<ul>\n<li>Frischen Sie Ihre Django-Kenntnisse mit unserem Blogbeitrag <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/01\/how-to-learn-django\/\"><em>So lernt man Django<\/em><\/a> auf, der ideal f\u00fcr Anf\u00e4nger*innen oder alle geeignet ist, die ihre Kenntnisse auf Vordermann bringen m\u00f6chten.<\/li>\n<\/ul>\n<ul>\n<li>Entdecken Sie mit unserem Tutorial zur Erstellung einer einfachen To-do-Anwendung, wie Sie <a href=\"https:\/\/www.jetbrains.com\/help\/pycharm\/creating-and-running-your-first-django-project.html\" target=\"_blank\" rel=\"noopener\">Ihr erstes Django-Projekt in PyCharm erstellen und ausf\u00fchren<\/a>, oder erkunden Sie unsere vollst\u00e4ndige Liste von <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/09\/django-project-ideas\/\">Django-Projektideen<\/a> f\u00fcr noch mehr Inspiration.<\/li>\n<\/ul>\n<ul>\n<li>Erfahren Sie mehr \u00fcber <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2024\/06\/the-state-of-django\/\">den aktuellen Stand von Django<\/a>, um sich \u00fcber die neuesten Trends im Bereich der Django-Entwicklung zu informieren und weitere Anregungen zu sammeln.<\/li>\n<\/ul>\n<ul>\n<li>Falls Sie noch nicht wissen, welches Python-Framework Sie verwenden sollen, k\u00f6nnten Ihnen unsere Vergleichsleitf\u00e4den <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2023\/11\/django-vs-flask-which-is-the-best-python-web-framework\/\"><em>Django vs. Flask<\/em><\/a> und <a href=\"https:\/\/blog.jetbrains.com\/pycharm\/2023\/12\/django-vs-fastapi-which-is-the-best-python-web-framework\/\"><em>Django vs. FastAPI<\/em><\/a> weiterhelfen.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\">Django-Unterst\u00fctzung in PyCharm<\/h3>\n<p>PyCharm Professional ist die beste IDE f\u00fcr die <a href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/web-development\/django\" target=\"_blank\" rel=\"noopener\">Entwicklung mit Django<\/a>. Dank Django-spezifischer Codehilfe, projektweiter Navigation und Refactoring sowie vollst\u00e4ndiger Unterst\u00fctzung f\u00fcr Django Templates k\u00f6nnen Sie schneller programmieren. Ein einziger Klick gen\u00fcgt, um sich mit Ihrer Datenbank zu verbinden und mit TypeScript, JavaScript und Frontend-Frameworks zu arbeiten. PyCharm unterst\u00fctzt auch Flask und FastAPI von Haus aus.<\/p>\n<p>Erstellen Sie bessere Anwendungen und rationalisieren Sie Ihren Code. Starten Sie jetzt mit PyCharm durch f\u00fcr eine reibungslose Erfahrung bei der Entwicklung mit Django.<\/p>\n<div class=\"buttons\">\n<div class=\"buttons__row\"><a class=\"btn\" href=\"https:\/\/www.jetbrains.com\/de-de\/pycharm\/web-development\/django\/\" target=\"\" rel=\"noopener\">Starten Sie mit PyCharm Pro kostenlos durch<\/a><\/div>\n<\/div>\n<p><strong>Autorin des urspr\u00fcnglichen Blogposts<\/strong><\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2021\/03\/evgenia-200x200.jpg\" width=\"200\" height=\"200\" alt=\"Evgenia Verbina\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                            <h4>Evgenia Verbina<\/h4>\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":811,"featured_media":577126,"comment_status":"closed","ping_status":"closed","template":"","categories":[1401,2347,8377],"tags":[963],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/577123"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/types\/pycharm"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/users\/811"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/comments?post=577123"}],"version-history":[{"count":4,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/577123\/revisions"}],"predecessor-version":[{"id":577150,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/pycharm\/577123\/revisions\/577150"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media\/577126"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/media?parent=577123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/categories?post=577123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/tags?post=577123"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/de\/wp-json\/wp\/v2\/cross-post-tag?post=577123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}