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 2 → Tutorial-Zusammenfassung
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.
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.
appname / models.py
.project / settings.py
hinzuappname / views.py
.
Hier wird auch das zu verwendende HTML vorbereitet.appname / urls.py
und verknüpfen Sie die URL mit Ansichtenappname / urls.py
aus project / urls.py
.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.
Ü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.
Es scheint, dass die Verbindung erfolgreich ist.
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.
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')
Es scheint, dass eine Zeichenfolge unter Verwendung der Vorlage ordnungsgemäß zurückgegeben wird.
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>
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>
Es scheint, dass das Piyo-Tag ausgegeben wurde, ohne dass es maskiert wurde.
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>
Es ist ein wenig uncool, aber es scheint richtig herauszukommen.
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>
Es sieht so aus.
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
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.
Die Detailseite ist vollständig.
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.
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.
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,
})
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>
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>
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.
Recommended Posts