Dieser Artikel ist eine Reihe, die das offizielle Django-Tutorial weiterentwickelt. Dieses Mal fahren wir mit dem dritten Artikel fort: "Erstellen Ihrer ersten Django-App, Teil 3".
Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ① (Projekterstellung ~) Django-Tutorial-Zusammenfassung für Anfänger von Anfängern Model (Model, Admin) Django Tutorial Zusammenfassung für Anfänger von Anfängern ③ (Anzeigen) Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ④ (generische Ansicht) Django Tutorial Zusammenfassung für Anfänger von Anfängern ⑤ (Test) Zusammenfassung des Django-Tutorials für Anfänger von Anfängern ⑥ (statische Datei) Zusammenfassung der Django-Tutorials für Anfänger durch Anfänger ⑦ (Admin anpassen)
https://docs.djangoproject.com/ja/3.0/intro/tutorial03/
Zu polls / views.py
hinzufügen.
polls/views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id)
def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
Fügen Sie es auch zu polls / urls.py
hinzu.
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
Diese Abfolge von Schritten ähnelt Routing-Arbeiten wie Rails.
polls/views.py
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
# Leave the rest of the views (detail, results, vote) unchanged
Dies funktioniert, aber ich werde es ändern, um die HTML-Vorlage wie Rails zu verwenden.
Erstellen Sie im Umfrageverzeichnis ein Vorlagen- / Umfrageverzeichnis.
Erstellen Sie templete`index.html für den Index.
polls/templates/polls/index.html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Auch der Ansichtsindex wird entsprechend geändert.
polls/views.py
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
polls/views.py
from django.shortcuts import render
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
Da der oben erwähnte Ablauf des Renderns der Templete-Reihe häufig verwendet wird, kann er auf diese Weise weggelassen werden.
Ändern Sie die Details, um einen Fehler anzuzeigen, wenn keine Frage mit der angeforderten Fragen-ID vorliegt.
polls/views.py
from django.http import Http404
from django.shortcuts import render
from .models import Question
# ...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})
polls/views.py
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
Verknüpfungen werden bereitgestellt, da häufig auch das Tragen von Http404 verwendet wird, wenn das vorherige Objekt nicht vorhanden ist.
Es gibt auch eine ähnliche Verknüpfung namens "get_list_or_404 ()". Diese Funktion verhält sich wie "get_object_or_404 ()", löst jedoch Http404 aus, wenn die Liste leer ist.
Erstellen Sie eine Vorlage, die dem obigen Detail entspricht.
polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
Einige der Links wurden in polls / index.html
fest beschichtet. Da das Argument name in der Pfadfunktion in polls.urls angegeben wurde, ersetzen Sie es durch dieses.
Dies macht es einfach, Links zu ändern, wenn sie sich ändern.
polls/index.html
- <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
+ <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
(Entfernen-, + hinzufügen)
Derzeit existiert nur die Umfrage-App, aber was ist, wenn es andere Apps gibt und das Namensargument derselben URL dort verwendet wird?
In diesem Fall fügen Sie poll_name
zu polls / urls.py
hinzu.
polls/urls.py
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
path('<int:question_id>/', views.detail, name='detail'),
path('<int:question_id>/results/', views.results, name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
polls / index.html wird entsprechend geändert.
polls/templates/polls/index.html
- <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
+ <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
Recommended Posts