[PYTHON] DJango Hinweis: Von Anfang an (Formularverarbeitung)

Tutorial 4. Wir haben endlich das letzte Tutorial eingegeben. Wir werden einen Abstimmungsantrag namens Umfragen beenden.

Vorlage mit Formular

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.

Nächstes Mal werde ich die generische Ansicht verwenden.

Recommended Posts

DJango Hinweis: Von Anfang an (Formularverarbeitung)
DJango Hinweis: Von Anfang an (mit einer generischen Ansicht)
DJango Hinweis: Von Anfang an (Erstellen einer Ansicht aus einer Vorlage)
DJango Memo: Von Anfang an (Vorbereitung)
DJango Hinweis: Von Anfang an (Vereinfachung und Aufteilung von URLConf)
DJango Memo: Von Anfang an (Modelleinstellung)
Holen Sie sich nur den Text aus dem Django-Formular.
DJango Memo: Von Anfang an (Erstellen einer Ansicht)
DJango Memo: Von Anfang an (Fehlerbildschirmeinstellung)
DJango Memo: Von Anfang an (weitere Änderungen am Verwaltungsbildschirm)
Django Note 4
Django Note 5
DJango-Memo: Von Anfang an (über den Verwaltungsbildschirm) mein Suchtpunkt
Django Note 1
Django Note 3
Django Note 2
Notizen vom Anfang von Python 1 lernen
Lassen Sie die Stückliste am Anfang der Zeichenfolge weg
Notizen vom Anfang von Python 2 lernen
DJango-Memo: Von Anfang an (Bearbeiten des Verwaltungsbildschirms) Es gibt ein Rätsel
Django Anfrageformular 2
[Django] Erstellen Sie ein Formular, das automatisch die Adresse aus der Postleitzahl ausfüllt
Finden des Beginns der Avenomics anhand der NT-Vergrößerung 2
Django Vorgeschlagene Form
Hebe die gefallenen Ohren von Django Form auf
Django Kontaktformular
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Lerne Nim mit Python (ab Anfang des Jahres).
Studie vom Anfang von Python Hour1: Hallo Welt
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Setzen Sie DateField des Formulars in Django auf type = date
[Version 2020] Scraping und Verarbeitung des Textes von Aozora Bunko
Studie aus Python Hour8: Verwenden von Paketen
[Django] Geben Sie Form einen dynamischen Anfangswert aus Model
Der Beginn von cif2cell
[Hinweis] Beginn der Programmierung
Django Girls Tutorial Hinweis
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Zu beachtende Punkte beim Löschen mehrerer Elemente aus der Liste
So nehmen Sie erste Einstellungen für die Django-Projekterstellung vor