[PYTHON] Résumé du tutoriel Django pour les débutants par les débutants ③ (Afficher)

introduction

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)

Création de votre première application Django, partie 3

https://docs.djangoproject.com/ja/3.0/intro/tutorial03/

Écrire plus de vues

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.

Écrivez une vue qui fonctionne réellement

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))

Raccourci: render ()

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.

Envoi d'une erreur 404

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})

Raccourci: get_object_or_404 ()

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.

Utiliser le système de modèles

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>

Supprimer l'URL codée en dur dans le modèle

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 +)

Espace de noms URL

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>

Recommended Posts

Résumé du tutoriel Django pour les débutants par les débutants ③ (Afficher)
Résumé du didacticiel 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 ⑦ (Personnaliser l'administrateur)
Résumé du tutoriel Django pour les débutants par les débutants ⑥ (fichier statique)
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 ① (création de projet ~)
Résumé du didacticiel Python Django
[Explication pour les débutants] Tutoriel TensorFlow MNIST (pour les débutants)
Résumé de l'apprentissage automatique par les débutants de Python
[Pour les débutants] Django -Construction d'environnement de développement-
Qu'est-ce que le grattage? [Résumé pour les débutants]
Tutoriel TensorFlow MNIST pour les débutants en ML
Résumé du didacticiel Django Girls Première moitié
Lien récapitulatif des bases de Pandas pour les débutants
[Déprécié] Tutoriel pour débutant Chainer v1.24.0
Tutoriel TensorFlow -MNIST pour les débutants en ML
Résumé de Django
Résumé de Django
[Résumé des commandes Linux] Liste des commandes [À voir absolument pour les débutants]
Fonctionnement Linux pour les débutants Résumé des commandes de base
Un manuel pour les débutants réalisé par des débutants Python
Une introduction à la programmation orientée objet pour les débutants par les débutants
Vue basée sur les fonctions Django
Tutoriel Python Django (5)
Tutoriel Python Django (2)
Résumé du didacticiel Python
mémo du didacticiel django
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Démarrer le didacticiel Django 1
À propos des fonctions d'ordre supérieur de Nim pour les débutants Nim écrites par les débutants Nim
Vue basée sur les classes Django
Résumé du filtre Django
Réalisation du didacticiel TensorFlow MNIST pour débutants en ML
Tutoriel Python Django (7)
Tutoriel Python Django (1)
Tutoriel du didacticiel Python Django
Tutoriel Python Django (3)
Tutoriel Python Django (4)
[Français] Tutoriel officiel NumPy "NumPy: les bases absolues pour les débutants"
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
Résumé des méthodes de prétraitement pour les débutants en Python (trame de données Pandas)
[Linux] Principes de base de la configuration des autorisations par chmod pour les débutants
[Pour les débutants] Django Commandes fréquemment utilisées et collection de références
Résumé du didacticiel d'apprentissage automatique
Paramètres Spacemacs (pour les débutants)
Didacticiel sur les associations polymorphes Django
Manuel python pour les débutants
Résumé Faker par langue
Modèle de configuration de Django2 View
Note du didacticiel Django Girls
Algorithme Dikstra pour les débutants
Résumé de l'apprentissage RAPIDS
OpenCV pour les débutants en Python
[Pour les débutants] Les bases de Python expliquées par Java Gold Part 2
[Traduisez approximativement le didacticiel TensorFlow en japonais] 1. MNIST pour les débutants en ML
[Pour les débutants] Résumé de l'entrée standard en Python (avec explication)