[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 4

introduction

Ravi de vous rencontrer, tout le monde. Je publierai le processus de création d'une application de vote (sondage) en utilisant Django comme mémorandum. Puisque je suis un débutant de Qiita, veuillez comprendre qu'il peut être difficile à lire.

séries

Commence travail

Rédiger un formulaire simple

J'écrirai le formulaire en HTML.

Vue de vote

Description de la balise de formulaire

--action: URL pour envoyer des données --method: méthode de transmission de données (get, post)

Description de la balise d'entrée

--type: bouton radio (radio), bouton soumettre (soumettre) --value: valeur actuelle --id: ID qui identifie le bouton

"{% Csrf_token%}" est un mécanisme de contre-mesure de falsification de requêtes intersites fourni par Django. Puisque nous utilisons la méthode POST, nous utiliserons csrf_token.

polls/template/polls/detail.html


<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{error_message}}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
<input type="submit" value="Vote">
</form>

Accédez au choix de données POST avec "request.POST ['choice']". Renvoie KeyError s'il n'y a pas de choix dans les données POST

Si une exception se produit, le formulaire de question sera à nouveau affiché avec une erreur.

"Reverse ('polls: results', args = (question.id))" renvoie la fonction polls / urls.py> path (name = 'results').

:polls/views.py

from django.http import HttpResponse, Http404, HttpResponseRedirect
from .models import Question, Choice
from django.shortcuts import render, get_object_or_404
from django.urls import reverse

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html',
                      {'question': question,
                       'error_message': "You didn't select a choice."})
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

C'est OK si vous accédez à "http://127.0.0.1:8000/polls/ " et que l'écran du formulaire s'affiche.

image.png

Vue des résultats

polls/template/polls/results.html



<h1>{{ question.question_text }}</h1>

<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
<ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>

polls/views.py



from django.http import Http404, HttpResponseRedirect

def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

Sélectionnez une option sur l'écran du formulaire «http://127.0.0.1:8000/polls/ » et appuyez sur le bouton Vote pour passer à l'écran ci-dessous. image.png

Utilisez une vue générique: moins de code, c'est bien

Nous continuerons à réduire le code. En particulier, nous éliminerons les pièces redondantes.

Ces vues représentent le cas général du développement Web de base. Autrement dit, il récupère les données de la base de données en fonction des paramètres transmis via l'URL, charge le modèle et renvoie le modèle rendu. Ceci est si courant que Django propose un raccourci appelé la vue générique. Une vue générique est une abstraction de modèles courants qui vous permet d'écrire votre application sans même écrire de code Python.

Modifier URLconf

Seuls le nom = détail et les résultats doivent être modifiés de "<int: questioniopkn_id>" à "<int: pk>". C'est parce qu'il utilise le DetailView, qui sera expliqué plus tard. name = index, detail, results créeront une classe plus tard, alors disons "vues. ** View.as_view ()"

polls/urls.py



    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
    path('<int:questiopkn_id>/vote/', views.vote, name='vote'),

Modifier les vues

views.py change beaucoup. J'utilisais beaucoup de fonctions dans def, mais j'utilise class.

--ListView La vue générique utilise le modèle "<nom de l'application> / <nom du modèle> _list.html" et transmet la variable de contexte "<nom du modèle> _list" pour le lettrage. Si vous utilisez l'attribut template_name, le modèle spécifié sera utilisé. L'attribut context_object_name entraîne l'utilisation de la variable de contexte spécifiée.

--DetailView La vue générale utilise le modèle "<nom de l'application> / <nom du modèle> _detail.html" et transmet la variable de contexte "<nom du modèle>" pour le lettrage. Si vous utilisez l'attribut template_name, le modèle spécifié sera utilisé. L'attribut context_object_name entraîne l'utilisation de la variable de contexte spécifiée. Comme spécifié dans urls.py, il dispose d'un mécanisme pour lire la clé primaire à partir de l'URL avec le nom "pk".

polls/views.py



# Create your views here.
from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django.urls import reverse
from django.views import generic

from .models import Question, Choice


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'


def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

C'est tout pour aujourd'hui. Merci beaucoup.

Recommended Posts

[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django-Partie 7-
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 1-
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 2
[Débutant] [Python / Django] Un ingénieur web débutant a essayé un didacticiel Django - Partie 0-
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un tutoriel Django - Partie 5
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un tutoriel Django - Partie 6
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 4
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 3
Framework Web Django Python
Déployer des applications Web Python 3.6 / Django / Postgres sur Azure
(Python) Essayez de développer une application Web en utilisant Django
Le débutant de la CTF a tenté de créer un serveur problématique (Web) [Problème]
Web scraping débutant avec python
Un ingénieur en arts libéraux a essayé de frapper 100 processus linguistiques en Python 02
Un débutant en python a essayé de faire un stage dans une entreprise informatique
Un ingénieur en arts libéraux a essayé de frapper 100 processus linguistiques en Python 01
Un ingénieur en arts libéraux a essayé de frapper 100 processus linguistiques en Python 00
[Python / Django] Créer une API Web qui répond au format JSON
J'ai essayé webScraping avec python.
Créer une application Web avec Django
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
le codeur Web a essayé d'exceller en Python
Les débutants en Python ont essayé d'utiliser Bottle et cela a fonctionné facilement de manière inattendue
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
Une introduction aux applications Web Python auto-conçues pour un ingénieur Web de troisième année paresseux
Une note où un débutant Python s'est retrouvé coincé
[Débutant] Scrapage Web Python facile à comprendre à l'aide de Google Colaboratory
J'ai une question! (Python, django) Facile
Démonisez une application Web Python avec Supervisor
J'ai essayé un langage fonctionnel avec Python
[Python] Une application web rapide avec Bottle!
J'ai créé une API Web
Utiliser Django à partir d'un script Python local
Exécutez une application Web Python avec Docker
Créez un framework Web avec Python! (1)
J'ai essayé de comparer le cadre d'application Web
Créez un framework Web avec Python! (2)
J'ai fait une application WEB avec Django
Un débutant en python a tenté de faire un stage dans une entreprise informatique [Enquête sur le chatbot jour 2]
Un débutant en python a tenté de faire un stage dans une entreprise informatique [Processus de développement du jour 1]
Les débutants ont essayé de créer une application Web native pour le cloud à l'aide de Datastore / GAE
J'ai recherché les compétences nécessaires pour devenir ingénieur web avec Python
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 1
Comment ouvrir un navigateur Web à partir de python
J'ai essayé le web scraping en utilisant python et sélénium
Python Web Framework Django vs Pyramid vs Flask Décembre 2015
J'ai essayé de jouer à un jeu de frappe avec Python
Démarrez un serveur Web Python simple avec Docker
Étapes pour développer une application Web en Python
[Python] Préparation au développement Web (création d'un environnement virtuel)
J'ai essayé de lire un fichier CSV en utilisant Python
Lancer un serveur Web avec Python et Flask
Mémo d'apprentissage automatique d'un ingénieur débutant Partie 2
Exécutez des fichiers Python à partir de HTML en utilisant Django
J'ai essayé d'ajouter un module Python 3 en C