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
J'écrirai le formulaire en HTML.
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/
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/
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.
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'),
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