[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 4-

Einführung

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

Fang an zu arbeiten

Schreiben Sie ein einfaches Formular

Ich werde das Formular in HTML schreiben.

Abstimmungsansicht

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/ " zugreifen und der Formularbildschirm angezeigt wird.

image.png

Ergebnisansicht

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/ " eine Option aus und klicken Sie auf die Schaltfläche "Abstimmen", um zum folgenden Bildschirm zu gelangen. image.png

Verwenden Sie die generische Ansicht: Weniger Code ist gut

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.

Ändern Sie die URLconf

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'),

Ansichten ändern

views.py ändert sich sehr. Ich habe in def viele Funktionen verwendet, aber ich benutze class.

--ListView Die generische Ansicht verwendet die Vorlage " / _list.html" und übergibt die Kontextvariable " _list" für die Beschriftung. Wenn Sie das Attribut template_name verwenden, wird die angegebene Vorlage verwendet. Das Attribut context_object_name bewirkt, dass die angegebene Kontextvariable verwendet wird.

--DetailView Die allgemeine Ansicht verwendet die Vorlage " / _detail.html" und übergibt die Kontextvariable "" für die Beschriftung. Wenn Sie das Attribut template_name verwenden, wird die angegebene Vorlage verwendet. Das Attribut context_object_name bewirkt, dass die angegebene Kontextvariable verwendet wird. Wie in urls.py angegeben, besteht der Mechanismus darin, den Primärschlüssel von der URL mit dem Namen "pk" zu lesen.

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

[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 7-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 1-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 2-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 0-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 5-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 6-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 4-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 3-
Django Python Web Framework
Stellen Sie Python 3.6 / Django / Postgres-Webanwendungen in Azure bereit
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
CTF-Anfänger haben versucht, einen Problemserver (Web) zu erstellen [Problem]
Web Scraping Anfänger mit Python
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 02 zu klopfen
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 01 zu klopfen
Ein Ingenieur für freie Künste hat versucht, 100 Sprachprozesse in Python 00 zu klopfen
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Ich habe versucht, WebScraping mit Python.
Erstellen Sie eine Webanwendung mit Django
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (05 ~ 09)
Webcodierer versucht Excel in Python
Python-Anfänger haben versucht, Bottle zu verwenden, und es hat unerwartet leicht funktioniert
Python-Anfänger versucht 100 Sprachverarbeitung klopfen 2015 (00 ~ 04)
Eine Einführung in selbst erstellte Python-Webanwendungen für einen trägen Webingenieur im dritten Jahr
Eine Notiz, in der ein Python-Anfänger stecken blieb
[Anfänger] Leicht verständliches Python-Web-Scraping mit Google Colaboratory
Ich habe eine Frage! (Python, Django) Einfach
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Ich habe eine funktionale Sprache mit Python ausprobiert
[Python] Eine schnelle Webanwendung mit Bottle!
Ich habe eine Web-API erstellt
Verwenden Sie Django aus einem lokalen Python-Skript
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie ein Webframework mit Python! (1)
Ich habe versucht, das Webanwendungs-Framework zu vergleichen
Erstellen Sie ein Webframework mit Python! (2)
Ich habe eine WEB-Bewerbung bei Django gemacht
Ein Python-Anfänger hat versucht, bei einem IT-Unternehmen zu praktizieren [Tag 2 Chatbot-Umfrage]
Python-Anfänger versuchte, bei einem IT-Unternehmen zu praktizieren [Tag 1 Entwicklungsprozess]
Anfänger haben versucht, eine Cloud-native Webanwendung mit Datastore / GAE zu erstellen
Ich suchte nach den Fähigkeiten, die erforderlich sind, um Webingenieur bei Python zu werden
Maschinelles Lernen eines jungen Ingenieurs Teil 1
So öffnen Sie einen Webbrowser über Python
Ich habe versucht, Web-Scraping mit Python und Selen
Python Web Framework Django gegen Pyramide gegen Flasche Dezember 2015
Ich habe versucht, mit Python ein Tippspiel zu spielen
Starten Sie mit Docker einen einfachen Python-Webserver
Schritte zum Entwickeln einer Webanwendung in Python
[Python] Webentwicklungsvorbereitung (Erstellen einer virtuellen Umgebung)
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Starten Sie einen Webserver mit Python und Flask
Maschinelles Lernen eines jungen Ingenieurs Teil 2
Führen Sie Python-Dateien mit Django aus HTML aus
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen