Schön euch alle kennenzulernen. Ich werde den Prozess der Erstellung eines Abstimmungsantrags mit Django als Memorandum veröffentlichen. Da ich ein Anfänger von Qiita bin, verstehen Sie bitte, dass es schwierig sein kann, es zu lesen.
Serie
Ich werde das Formular in HTML schreiben.
Beschreibung des Formular-Tags
--action: URL zum Senden von Daten --method: Datenübertragungsmethode (get, post)
Beschreibung des Eingabe-Tags
--type: Optionsfeld (Radio), Senden-Schaltfläche (Senden) --Wert: aktueller Wert --id: ID, die die Schaltfläche identifiziert
"{% Csrf_token%}" ist ein von Django bereitgestellter Gegenmaßnahmenmechanismus für fälschungsübergreifende Fälschungen. Da wir die POST-Methode verwenden, verwenden wir 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>
Greifen Sie mit "request.POST ['choice']" auf die POST-Datenauswahl zu. Gibt KeyError zurück, wenn die POST-Daten keine Auswahl enthalten
Wenn eine Ausnahme auftritt, wird das Fragenformular mit einem Fehler erneut angezeigt.
"Reverse ('polls: results', args = (question.id))" gibt die Funktion polls / urls.py> path (name = 'results') zurück.
: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,)))
Es ist in Ordnung, wenn Sie auf "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})
Wählen Sie im Formularbildschirm "http://127.0.0.1:8000/polls/
Wir werden den Code weiter reduzieren. Insbesondere werden wir redundante Teile beseitigen.
Diese Ansichten stellen den allgemeinen Fall der grundlegenden Webentwicklung dar. Das heißt, es ruft Daten aus der Datenbank gemäß den über die URL übergebenen Parametern ab, lädt die Vorlage und gibt die gerenderte Vorlage zurück. Dies ist so häufig, dass Django eine Verknüpfung anbietet, die als generische Ansicht bezeichnet wird. Eine generische Ansicht ist eine Abstraktion gängiger Muster, mit der Sie eine Anwendung schreiben können, ohne Python-Code zu schreiben.
Nur Name = Detail und Ergebnisse sollten von "<int: questioniopkn_id>" in "<int: pk>" geändert werden. Dies liegt daran, dass die Detailansicht verwendet wird, die später erläutert wird. Name = Index, Detail, Ergebnisse erstellen später eine Klasse. Sagen wir also "Ansichten. ** 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 ändert sich sehr. Ich habe in def viele Funktionen verwendet, aber ich benutze class.
--ListView Die generische Ansicht verwendet die Vorlage "
--DetailView Die allgemeine Ansicht verwendet die Vorlage "
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,)))
Das ist alles für heute. Vielen Dank.
Recommended Posts