Cet article est une série qui fait progresser le didacticiel officiel de Django. Cette fois, nous allons passer au troisième article, "Créer votre première application Django, partie 3".
Résumé du tutoriel Django pour les débutants par les débutants ① (création de projet ~) Résumé du tutoriel Django pour les débutants par les débutants ② (Modèle, Admin) Résumé du tutoriel Django pour les débutants par les débutants ③ (Afficher) Résumé du tutoriel Django pour les débutants par les débutants ④ (Vue générique) Résumé du tutoriel Django pour les débutants par les débutants ⑤ (test) Résumé du tutoriel Django pour les débutants par les débutants ⑥ (fichier statique) Résumé des tutoriels Django pour les débutants par les débutants ⑦ (Customize Admin)
https://docs.djangoproject.com/ja/3.0/intro/tutorial03/
Ajoutez à polls / views.py
.
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)
Ajoutez-le également à polls / urls.py
.
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'),
]
Cette séquence d'étapes est similaire au travail de routage tel que 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
Cela fonctionne, mais je vais le changer pour utiliser le modèle Html comme Rails.
Dans le répertoire polls, créez un répertoire templates / polls.
Créez un templeteʻindex.html pour l'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 %}
De plus, l'index de vue sera modifié en conséquence.
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)
Puisque le flux de rendu de la série de Templete mentionné ci-dessus est souvent utilisé, il peut être omis de cette manière.
Modifiez les détails pour donner une erreur lorsqu'une question avec l'ID de question demandé n'existe pas.
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})
Des raccourcis sont fournis car le processus consistant à porter Http404 lorsque l'objet précédent n'existe pas est également souvent utilisé.
Il existe également un raccourci similaire appelé get_list_or_404 ()
. Cette fonction se comporte comme get_object_or_404 ()
, mais lance Http404 si la liste est vide.
Créez un modèle correspondant au détail ci-dessus.
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>
Certains des liens ont été traités en dur dans polls / index.html
. Puisque l'argument de nom a été spécifié dans la fonction de chemin dans polls.urls, remplacez-le par celui-ci.
Cela facilite la modification des liens lorsqu'ils changent.
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>
(Supprimer-, ajouter +)
Actuellement, seule l'application de sondages existe, mais que se passe-t-il s'il existe d'autres applications et que l'argument de nom de la même URL y est utilisé?
Dans ce cas, ajoutez ʻapp_name à
polls / urls.py`.
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 sera modifié en conséquence.
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>