Python Django Tutorial (3)

Dies ist ein Material für Lernsitzungen. Ich werde es erklären, während ich dem Tutorial von django1.8 folge. https://docs.djangoproject.com/en/1.8/intro/tutorial03/

Da Version 1.4 die neueste Version des offiziellen japanischen Dokuments ist, gibt es einige Unterschiede, aber der allgemeine Ablauf ist der gleiche. Es ist daher eine gute Idee, ihn zu lesen. http://django-docs-ja.readthedocs.org/en/latest/intro/tutorial03.html

Tutorial 1 Tutorial 2Tutorial-Zusammenfassung

Überblick

In diesem Tutorial erklären wir Ansicht und URL. Obwohl es als Ansicht bezeichnet wird, entspricht es einer Steuerung im Allgemeinen MVC. Das Äquivalent zu MVC View ist eine Vorlage, die aus der Ansicht aufgerufen wird.

Ich sage etwas über MVC, also hör es dir bitte leicht an.

Ansicht erstellen und URL verbinden

Dokument → https://docs.djangoproject.com/de/1.8/intro/tutorial03/#write-your-first-view Quelle → 7f5128a 3efdc15

In diesem Tutorial werden die 5. bis 7. Teile der Anwendungserstellung erläutert, die in Tutorial (1) erläutert werden.

Vorher werde ich den Ablauf des Erstellens einer Anwendung mit django erläutern.

  1. Fügen Sie eine Anwendung mit "$ ./manage.py startapp appname" hinzu.
  1. Beschreiben Sie das in der Anwendung verwendete Modell (Datenbanktabelle) in appname / models.py.
  1. Fügen Sie die erstellte App zu project / settings.py hinzu
  1. Datenbankaktualisierung
  1. Beschreiben Sie die Modellanzeige und -operationen (Hinzufügen, Bearbeiten usw.) in appname / views.py. Hier wird auch das zu verwendende HTML vorbereitet.
  2. Schreiben Sie appname / urls.py und verknüpfen Sie die URL mit Ansichten
  3. Lesen Sie appname / urls.py aus project / urls.py.

Ansicht hinzufügen

view ist eine Funktion, die HttpRequest empfängt und HttpResponse zurückgibt.

Schreiben wir die Ansichtsfunktion, indem wir dem ursprünglichen Tutorial folgen.

polls/views.py


from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

Die view-Methode empfängt immer die HttpRequest-Klasse als erstes Argument. Außerdem muss die HttpResponse-Klasse (oder eine Klasse, die sie erbt) als Rückgabewert zurückgegeben werden.

Natürlich können Sie den Vorgang allein nicht verstehen. Lassen Sie uns also die URL verbinden und anzeigen.

URL-Einstellung

Überprüfen Sie beim Zugriff auf django zunächst ROOT_URLCONF (standardmäßig project / urls.py, Tutorial / urls.py in diesem Tutorial), um festzustellen, welche Ansicht aufgerufen werden soll.

Ein Array namens "urlpatterns" wird in urls.py festgelegt. Die Elemente des Arrays werden mit der URL-Funktion hinzugefügt.

Der Inhalt ist "url resolver", aber ich werde ihn weglassen, weil es eine verrückte Geschichte sein wird.

Die URL-Funktion verbindet URL mit Ansicht oder URL mit anderen URL-Mustern.

Schauen wir uns die Quelle an.

polls/urls.py


from django.conf.urls import url

from . import views


urlpatterns = [
    url(r'^$', views.index, name='index'),  #URL und Ansicht verknüpfen
]

Zu diesem Zeitpunkt waren polls.views.index und polls url verbunden, polls.urls ist jedoch nicht root_url. Es kann noch nicht vom Browser bestätigt werden.

tutorial/urls.py


from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls')),  #URL mit anderen URL-Mustern verknüpfen
]

Die root_url wurde aktualisiert. Jetzt ruft die URL, die mit polls / übereinstimmt, polls.urls auf und Sie können sie in Ihrem Browser sehen.

Greifen wir auf http: // localhost: 8000 / polls / zu.

Kobito.JVhyfF.png

Es scheint, dass die Verbindung erfolgreich ist.

URL-Funktion

Beschreiben Sie in der URL-Funktion den regulären Ausdruck der URL im ersten Argument und übergeben Sie den Rückgabewert der Ansichtsfunktion oder der Include-Funktion im zweiten Argument. Wenn Sie> r '' schreiben, wird dies möglicherweise mit einem regulären Ausdruck verwechselt, es handelt sich jedoch um eine rohe Zeichenfolge.

\ Wird anstelle des Escapezeichens unverändert ausgegeben. Das dritte Argument, name = 'index'), bezieht sich auf die umgekehrte URL. Es wird zum Umleiten zu einer anderen Ansicht und zum Verknüpfen in einer Vorlage verwendet.

Wenn include verwendet wird, wird der Teil, aus dem die übereinstimmende Zeichenfolge entfernt wird, an die nächsten URL-Muster übergeben.

Verwendung der Vorlage

Dokument → https://docs.djangoproject.com/de/1.8/intro/tutorial03/#a-shortcut-render Quelle → 3efdc15 18eb3f6

Die Verbindung zwischen URL und Ansicht war erfolgreich, aber die Antwortzeichenfolge ist nicht so handgeschrieben. Als nächstes verwenden wir die Vorlage.

Die Vorlage wird unter app / templates / app / installiert. Das Format ist fast das gleiche wie bei allgemeinem HTML, aber wenn Sie es mit zwei mittleren Klammern wie "{{var}}" einschließen Sie können den von Python übergebenen Wert verwenden. Sie können auch eine Funktion namens Template-Tag im Format "{% func%}" ausführen.

Erstellen Sie es zunächst mit normalem HTML.

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
</body>
</html>

Schreiben Sie dann die Ansicht neu. Das ursprüngliche Tutorial führt in das Erstellen einer Zeichenfolge mithilfe einer Vorlage ein Dieses Mal werde ich Ihnen zeigen, wie Sie es überspringen und die Renderfunktion verwenden. Diese Funktion gibt Ihnen das Ergebnis des Renderns mit dieser Vorlage, wenn Sie die Anforderung und den Vorlagenpfad übergeben. Es wird als HttpResponse zurückgegeben. Ändern Sie die Quelle wie folgt und überprüfen Sie sie mit einem Browser.

polls/views.py


from django.shortcuts import render


def index(request):
    return render(request, 'polls/index.html')

Kobito.W5zmjU.png

Es scheint, dass eine Zeichenfolge unter Verwendung der Vorlage ordnungsgemäß zurückgegeben wird.

Übergabe des Werts an die Vorlage

Quelle → 1ade762 c49d0c6

Inzwischen sollten Sie in der Lage sein, statische Seiten zu erstellen. Als nächstes erstellen wir eine dynamische Seite. Sie können einen Wert an die Vorlage übergeben, indem Sie ein Wörterbuch an das dritte Argument von render übergeben. Wenn Sie den in der Vorlage übergebenen Wert verwenden, schreiben Sie ihn in das Format "{{var}}".

Lassen Sie uns die Ansicht neu schreiben und einen geeigneten Wert übergeben.

polls/views.py


from django.shortcuts import render


def index(request):
    return render(request, 'polls/index.html', {
        'hoge': 'test string',
        'fuga': '<br>tag</br>',
    })

Schreiben Sie als Nächstes das HTML neu und zeigen Sie den empfangenen Wert an.

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
  <p>{{ hoge }}</p>
  <p>{{ fuga }}</p>
</body>
</html>

Kobito.glaQa6.png

Es scheint, dass der empfangene Wert richtig angezeigt wird. In Fuga wurde das Tag "
" jedoch maskiert und ausgegeben. Ich freue mich über die Sicherheit, aber ich habe Probleme, wenn ich Tags ausgeben möchte. Verwenden Sie zum Ausgeben des Tags die Funktion django.utils.html.mark_safe. Wie der Name schon sagt, markiert diese Funktion die Zeichenfolge als sicher und verhindert, dass sie nicht mehr maskiert wird.

Übergeben wir eine neue Zeichenfolge mit mark_sake an piyo und geben sie aus.

polls/views.py


from django.shortcuts import render
from django.utils.html import mark_safe


def index(request):
    return render(request, 'polls/index.html', {
        'hoge': 'test string',
        'fuga': '<br>tag</br>',
        'piyo': mark_safe('<br>tag</br>'),
    })

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
  <p>{{ hoge }}</p>
  <p>{{ fuga }}</p>
  <p>{{ piyo }}</p>
</body>
</html>

Kobito.8qg0k1.png

Es scheint, dass das Piyo-Tag ausgegeben wurde, ohne dass es maskiert wurde.

Zusammenarbeit mit dem Modell

Quelle → c49d0c6 95339e5

Nachdem ich mit der Zeichenfolge ziemlich zufrieden bin, zeigen wir das Fragenmodell an. Sie übergeben jedoch nur eine Instanz des Modells oder einen Abfragesatz anstelle einer Zeichenfolge. Eine ausführliche Erläuterung des Abfragesatzes wird später gegeben. Denken Sie vorerst daran, dass Sie den Abfragesatz für dieses Modell mit "Model.objects" abrufen können.

Wenn Sie es sofort wissen möchten, lesen Sie bitte das Originaldokument. → https://docs.djangoproject.com/en/1.8/ref/models/querysets/

Versuchen wir, alle Objekte des Fragenmodells an eine Vorlage mit dem Namen "Fragen" zu übergeben.

polls/views.py


from django.shortcuts import render

from .models import Question


def index(request):
    return render(request, 'polls/index.html', {
        'questions': Question.objects.all(),
    })

Lassen Sie es uns in HTML anzeigen und mit einem Browser überprüfen.

polls/templates/polls/index.html


<html>
<body>
  {{ questions }}
</body>
</html>

Kobito.nM35Me.png

Es ist ein wenig uncool, aber es scheint richtig herauszukommen.

Ändern Sie die Vorlagenanzeige

Quelle → 95339e5 943e24b

Da Fragen ein Array sind, verwenden Sie die in der Vorlage standardmäßig bereitgestellte Funktion "{% für%}", um das Erscheinungsbild zu verbessern.

polls/templates/polls/index.html


<html>
<body>
  <table border="1">
    <tr>
      <th>Inhalt der Frage</th>
      <th>Veröffentlichungsdatum</th>
    </tr>
    {% for question in questions %}
    <tr>
      <td>{{ question.question_text }}</td>
      <td>{{ question.pub_date }}</td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

Kobito.LmxoBX.png

Es sieht so aus.

Detailbildschirm hinzufügen

Quelle → 943e24b e86d795

Der Listenbildschirm ist vorerst gut, aber dieses Mal erstellen wir einen individuellen Detailbildschirm. Der Ablauf ist der gleiche. Bereiten Sie einfach eine Ansicht vor und verbinden Sie die URL. Da es sich um einen Detailbildschirm handelt, muss ein bestimmtes Objekt im Modell angegeben werden. Dieses Mal erhalten wir als allgemeine Methode des Django den pk des Objekts.

Die Ansicht sieht so aus.

polls/views.py


...
def detail(request, pk):
    return render(request, 'polls/detail.html', {
        'question': Question.objects.get(pk=pk)
    })

Vergessen Sie nicht, detail.html vorzubereiten, das aus der Ansicht aufgerufen wird.

polls/templates/polls/detail.html


<html>
<body>
  {{ question }}
</body>
</html>

Ändern Sie als Nächstes die URL. Die URL kann mit der Zeichenfolge in der URL als Argument im Format "(? P pattern)" an die Ansichtsfunktion übergeben werden.

polls/urls.py


...
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'(?P<pk>\d+)/$', views.detail, name='poll_detail'),
]

In diesem Fall wie http: // localhost: 8000 / polls / 1 / oder http: // localhost: 8000 / polls / 3 / Dies bedeutet, dass die Zahlen 1 und 3 als Argument von pk an die Detailfunktion übergeben werden.

Kobito.WlPWYR.png

Kobito.cJ7N4Z.png

Die Detailseite ist vollständig.

404 Seiten hinzugefügt

Quelle → e86d795 da8d171

Der Detailbildschirm wurde erstellt. Wenn Sie jedoch ein nicht vorhandenes Paket wie 10 in die URL eingeben, wird der folgende Bildschirm angezeigt.

Kobito.mFw3WE.png

Die Methode "Model.objects.get" löst eine Ausnahme von "DoesNotExist" aus, wenn das Objekt unter den angegebenen Bedingungen nicht erfasst werden kann, was zu einem Bildschirm wie diesem führt. Der Rückgabewert der Ansichtsfunktion muss HttpResponse sein. Ändern Sie ihn daher so, dass er die Ausnahme abfängt und Seite 404 anzeigt.

polls/views.py


from django.shortcuts import Http404
...
def detail(request, pk):
    try:
        obj = Question.objects.get(pk=pk)
    except Question.DoesNotExist:
        raise Http404
    return render(request, 'polls/detail.html', {
        'question': obj,
    })

Es scheint, dass Sie eine Http404-Ausnahme anstelle von HttpResponse auslösen, aber Wenn Sie die Http404-Ausnahme auslösen, wird sie von der Middleware abgefangen und eine Seite für 404 erstellt.

Kobito.fcoOLN.png

Eine etwas bequemere 404-Seite

Quelle → da8d171 2b823b3

Da es eine allgemeine Operation ist, zu versuchen, ein Objekt mit einem Primärschlüssel usw. zu erhalten und 404 zurückzugeben, wenn nicht Eine praktische Verknüpfungsfunktion wird bereitgestellt. Sie können dieselbe Operation wie mit "try-without" schreiben, indem Sie einfach von welchem Modell und unter welchen Bedingungen schreiben.

polls/views.py


from django.shortcuts import get_object_or_404
...
def detail(request, pk):
    obj = get_object_or_404(Question, pk=pk)
    return render(request, 'polls/detail.html', {
        'question': obj,
    })

Verbindung von der Listenseite zum Detailbildschirm

Dokumente → https://docs.djangoproject.com/de/1.8/intro/tutorial03/#removing-hardcoded-urls-in-templates Quelle → 2b823b3 99b01e3

Nachdem die Listenseite und der Detailbildschirm erstellt wurden, fügen wir einen Link von der Listenseite zum Detailbildschirm hinzu. Verwenden Sie das Tag "{% url%}", um einen Link in HTML einzubetten. Die URL wird generiert, indem der Name der URL an das Argument dieses Tags übergeben wird. Der URL-Name </ b> ist hier der im dritten Argument der URL-Funktion angegebene name = 'hoge'.

In den bisherigen Tutorials werden die Namen "index" und "poll_detail" festgelegt. Dieses Mal erstellen wir einen Link zu poll_detail in index.html. Beachten Sie, dass poll_detail das pk des Frageobjekts als Argument erhalten muss.

polls/templates/polls/index.html


<html>
<body>
  <table border="1">
    <tr>
      <th>Inhalt der Frage</th>
      <th>Veröffentlichungsdatum</th>
      <th></th>
    </tr>
    {% for question in questions %}
    <tr>
      <td>{{ question.question_text }}</td>
      <td>{{ question.pub_date }}</td>
      <td><a href="{% url 'poll_detail' question.pk %}">Zum detaillierten Bildschirm</a></td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

Kobito.hqbo81.png

Der Link zum Detailbildschirm wurde erfolgreich gepostet.

Lassen Sie uns auch einen Link vom Detailbildschirm zum Listenbildschirm einfügen.

polls/templates/polls/detail.html


<html>
<body>
  <a href="{% url 'index' %}">Zum Listenbildschirm</a><br>
  {{ question }}
</body>
</html>

Kobito.AvWWsf.png

Jetzt müssen Sie die URL nicht mehr direkt eingeben.

-- Die Reihenfolge der Erklärungen war etwas anders als im ursprünglichen Tutorial, aber im nächsten Tutorial werden wir uns mit Formularen befassen.

Zum nächsten Tutorial

Tutorial-Zusammenfassung

Recommended Posts

Python Django Tutorial (5)
Python Django Tutorial (2)
Python Django Tutorial (8)
Python Django Tutorial (6)
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Python Django Tutorial (3)
Python Django Tutorial (4)
Python-Tutorial
Python Django Tutorial Cheet Sheet
Zusammenfassung des Python-Tutorials
Django Tutorial Memo
Starten Sie das Django Tutorial 1
Django 1.11 wurde mit Python3.6 gestartet
[Docker] Tutorial (Python + PHP)
Django Python Web Framework
Django Polymorphic Associations Tutorial
Django Oscar einfaches Tutorial
Django Python Verschiebungstabelle
Versuchen Sie Debian + Python 3.4 + django1.7 ……
Python OpenCV Tutorial Memo
[Python-Tutorial] Datenstruktur
Django Girls Tutorial Hinweis
Cloud Run Tutorial (Python)
Python Django CSS reflektiert
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Einführung in Python Django (2) Win
[Python-Tutorial] Kontrollstruktur-Tool
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Python3 + Django ~ Mac ~ mit Apache
ToDo-Listenerstellung [Python Django]
Erste Schritte mit Python Django (1)
Fangen Sie mit Django an! ~ Tutorial ④ ~
Django
Erste Schritte mit Python Django (4)
Erste Schritte mit Python Django (3)
Installieren Sie Python 3.7 und Django 3.0 (CentOS)
[Python] Persönliches Tutorial zum Entscheidungsbaum
GAE + Python + Django süchtig machende Geschichte
Einführung in Python Django (6)
Erste Schritte mit Python Django (5)
Bis zur Veröffentlichung von Python [Django] de Web Service [Tutorial Teil 1]
Gehirnwellenanalyse mit Python: Python MNE-Tutorial
8 häufig verwendete Befehle in Python Django
Python Practice_Virtual Environment Setup ~ Django-Installation
Erstellen Sie eine neue Anwendung mit Python, Django
Python + Django + Scikit-Learn + Mecab (1) mit Heroku
Führen Sie python3 Django1.9 mit mod_wsgi aus (deploy)
Django Girls Tutorial Zusammenfassung Erste Hälfte
Stolpern Sie beim Django 1.7-Tutorial
Stellen Sie das Django-Lernprogramm für IIS bereit ①
Installieren Sie das Python Framework Django mit pip
Einführung in Python Django (2) Mac Edition
[Python Tutorial] Eine einfache Einführung in Python
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 5 ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps mit Python ~ Django Tutorial 4 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 1, 2, 3 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 7 ~
Django Crispy Tutorial (Umgebungskonstruktion auf Mac)