Tutorial 4. Wir haben endlich das letzte Tutorial eingegeben. Wir werden einen Abstimmungsantrag namens Umfragen beenden.
Beschreiben Sie die Vorlage der Detailseite wie folgt.
detail.html ######
<h1>{{ poll.question }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="/polls/{{ poll.id }}/vote/" method="post">
{% csrf_token %}
{% for choice in poll.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}"
value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
{% endfor %}
<input type="submit" value="Abstimmung" />
</form>
Es enthält einige Wörter, die Sie zum ersten Mal sehen.
Sie können sich das mit Namen vorstellen, aber es ist ein Wert, der auf der Seite views.py definiert ist, sodass Sie ihn nicht separat speichern müssen.
Ein Klischee, das angibt, wie oft die Schleife gedreht wurde. Es ist leicht zu merken, weil es nur die Bedeutung ist.
Sogenannte CSRF-Maßnahmen. Dies scheint das Wichtigste zu sein. Wenn Sie eine POST-Methode an Ihre Site senden möchten, sollten Sie dies als obligatorisch betrachten. Was ist CSRF? Also habe ich gegoogelt. http://e-words.jp/w/CSRF.html Zur Vereinfachung wird views.py ebenfalls bearbeitet.
views.py ####
from django.template import RequestContext #RequestContext scheint eine Unterklasse von Context zu sein
# ...
def detail(request, poll_id):
pobject = get_object_or_404(Poll, pk=poll_id) #pk ist eine Abkürzung für Primary Key. Reserviertes Wort?
return render_to_response('polls/detail.html', {'poll': pobject},
context_instance=RequestContext(request)) # context_Eine neue Instanz wurde hinzugefügt. Vielleicht reservierte Worte
Implementieren Sie auch den Abstimmungsteil.
from django.shortcuts import get_object_or_404, render_to_response
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.template import RequestContext
from polls.models import Choice, Poll
#...
def vote(request, poll_id):
pobject = get_object_or_404(Poll, pk=poll_id)
try:
selected_choice = pobject.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
return render_to_response('polls/detail.html', {
'poll': pobject,
'error_message': "Wählen Sie zuerst die Option",
}, context_instance=RequestContext(request))
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls.views.results', args=(pobject.id,)))
Hier sind einige Wörter, die ich noch nicht gesehen habe, also werde ich sie zusammenfassen.
Derjenige, der die POST-Daten empfangen hat. Sie können den Wert gemäß dem Namen abrufen, indem Sie request.POST ['name'] ausführen. Ich habe das Gefühl, dass es in einigen Sprachen als $ _POST geschrieben ist.
Eine Unterklasse des Kontexts. Sie müssen das HttpRequest-Objekt hier in das erste Argument einfügen. Hier wird die erste Argumentanforderung der Ansichtsfunktionsabstimmung unverändert eingegeben (die aufgerufene HttpRequest wird wahrscheinlich automatisch dem ersten Argument der Ansichtsfunktion zugewiesen).
Der Name (wahrscheinlich festgelegt), der verwendet werden soll, wenn render_to_response mit einer Verknüpfung zurückgegeben wird. Weisen Sie ein HttpRequest-Objekt zu.
render_to_response('for/your/template',{'name':value},context_instance)
Haben Sie das Gefühl, dass Sie die Vorlage im ersten Argument angeben, die Daten in das zweite Argument einfügen und die Daten in der Anforderung des dritten Arguments an die Vorlage übergeben?
Aktualisieren Sie die eingestellte Datenbank. Hier wird der Wert von selected_choice.votes (in models.py definierter Datenname) um eins erhöht und dann überschrieben.
Ich bin mir allein nicht sicher. Wenn Sie also etwas tiefer graben, Diese selected_choice scheint sich auf die Daten mit dem POSTed-Wert von'choice 'als Primärschlüssel aus dem choice_set zu beziehen. Diese Auswahlmenge ist also eine Reihe von Auswahlmöglichkeiten, die von pobject erhalten wurden (die Art und Weise, wie hoge_set geschrieben wird, scheint ein Klischee zu sein. Einzelheiten finden Sie in Tutorial 1. in tutorial01.html)). Wenn ich die Vorlage überprüfe, lautet der Wert des Optionsfelds "Auswahl" "{{choice.id}}". Wie lautet diese ID?
python manage.py sql polls
Kann bei bestätigt werden
"id" integer NOT NULL PRIMARY KEY
Die Daten sehen folgendermaßen aus (die ID scheint automatisch generiert zu werden, auch wenn sie nicht in models.py definiert ist). Kurz gesagt, es ist wie die Anzahl der Wahlmöglichkeiten.
Mit anderen Worten
# def vote….
selected_choice.votes += 1
selected_choice.save()
In dem Teil von werden die Daten mit dem Wert der ausgewählten Auswahl als ID hinzugefügt und gespeichert. Wenn Sie die Vorlage überprüfen, entspricht diese ID dem aktuellen Wert des Optionsfelds. Infolgedessen werden die Daten des durch das Optionsfeld ausgewählten Elements aktualisiert.
Ich bin überrascht, dass es so lange her ist, aber das ist wahrscheinlich der Prozessablauf (bitte sagen Sie mir, ob es anders ist).
In früheren Programmen war es ausschließlich HttpResponse, aber hier ist Redirect angehängt. Im ersten umgekehrten Argument sind die Inhalte
’/polls/[id]/results/‘
Es wird konvertiert und zurückgegeben als. Umleitungsziel angeben? args scheint das Argument zu sein, das zum Umleitungsziel gebracht werden soll (kann es in die poll_id der Ergebnisfunktion eingefügt werden?). Es gibt hier nur einen Inhalt, aber vergessen Sie nicht, ein Komma hinzuzufügen! Es scheint die eiserne Regel des Web zu sein, umzuleiten, wenn POST erfolgreich ist.
Als nächstes werden wir die Umleitungszielergebnisse entwerfen.
def results(request, poll_id):
pobject = get_object_or_404(Poll, pk=poll_id)
return render_to_response('polls/results.html', {'poll': pobject})
Machen Sie auch eine Vorlage.
results.html ######
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice }} -- {{ choice.votes }}Abstimmung</li>
{% endfor %}
</ul>
<a href="/polls/{{ poll.id }}/">Stimmen Sie noch ab?</a>
Das Obige ist die Zusammenfassung des Tutorials. In diesem Fall verwende ich jedoch häufig Verknüpfungen. Das würde mir nicht helfen, also habe ich es in eines umgeschrieben, das keine Verknüpfungen verwendet.
views.py ######
from polls.models import Poll,Choice
from django.http import HttpResponse,HttpResponseRedirect
from django.template import Context,loader,RequestContext
from django.core.urlresolvers import reverse
from django.http import Http404
def index(req):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
temp = loader.get_template('polls/index.html')
contxt = Context({
'latest_poll_list':latest_poll_list
})
return HttpResponse(temp.render(contxt))
def detail(req,poll_id):
try:
pobject = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
temp = loader.get_template('polls/detail.html')
contxt = RequestContext(req,{
'poll':pobject
})
return HttpResponse(temp.render(contxt))
def results(req,poll_id):
try:
pobject = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
temp = loader.get_template('polls/results.html')
contxt = Context({
'poll':pobject
})
return HttpResponse( temp.render(contxt) )
def vote(req,poll_id):
try:
pobject = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
try:
selected_choice = pobject.choice_set.get(pk=req.POST['choice'])
except (KeyError,Choice.DoesNotExist):
temp = loader.get_template('polls/detail.html')
contxt = RequestContext(req,{
'poll':pobject,
'error_message':"You have to select choice!"
})
return HttpResponse(temp.render(contxt))
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect( reverse('polls.views.results',args=(pobject.id,) ) )
Ichiou Operation wird ebenfalls bestätigt.
Ich hatte Probleme damit, wo ich die context_instance platzieren sollte, die als drittes Argument in der Antwort auf Detail und Abstimmung enthalten ist. Gelöst durch Schreiben von RequestContext (Anfrage, {'Name': Wert}).
Trotzdem habe ich das gleiche oft geschrieben und es ist nicht cool. Ich habe es geschafft, den Ablauf zu verstehen, und vielleicht ist es Zeit, die Verknüpfung zu verwenden.
Recommended Posts