[PYTHON] Fangen Sie mit Django an! ~ Tutorial ④ ~

Überblick

Dies ist eine Fortsetzung von Letztes Mal. Dieses Mal werde ich mich auf die Formularverarbeitung und Code-Reduzierung durch Django konzentrieren.

Formularerstellung

Lassen Sie uns das Tutorial polls / detail.html aktualisieren, das im Tutorial Letztes Mal erstellt wurde, um das HTML \

-Element einzuschließen.

polls/templates/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>

Die Punkte sind wie folgt.

--csrf_token ist eine standortübergreifende Gegenmaßnahme von Django. --forloop.counter repräsentiert die Anzahl in Djangos Forloop. ――Nachdem werden auf der königlichen Straße der Webentwicklung beim Senden die ausgewählten Werte für Name und Wert an das angegebene Aktionsziel gesendet.

Als nächstes ändern wir das Ziel "Umfragen / Abstimmung". Es wird eine Änderung der Ansicht sein.

polls/views.py


from django.shortcuts import render, get_object_or_404
from .models import Question, Choice  #Auswahlmodell hinzugefügt
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse  #Rückseite hinzufügen


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {
        'latest_question_list': latest_question_list,
    }
    return render(request, 'polls/index.html', context)


def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    context = {
        'question': question
    }
    return render(request, 'polls/detail.html', context)


def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)

#ViewAction wurde diesmal geändert
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))
        )

Feste Abstimmungsaktion. Ich werde die Teile erklären, die bisher nicht in der Erklärung enthalten sind.

request.POST

Wir haben immer Anfrage als erstes Argument einer Aktion angegeben. Es ist endlich Zeit, es hier zu benutzen.

Es ist ein wörterbuchähnliches Objekt, das auf die auf Anfrage gesendeten POST-Daten zugreifen kann. In diesem Fall lautet die mit dem Frageobjekt verknüpfte Auswahl selected_set.get, und pk wird als get-Filter angegeben.

Zu diesem Zeitpunkt können Sie auf Anfrage.POST ['Auswahl'] auf die Auswahl der POST-Daten zugreifen. (Auswahl ist die Auswahl des Namensattributs)

In ähnlicher Weise existiert auch request.GET, aber dieses Mal senden wir POST-Daten mit method = POST, sodass wir sie per POST erhalten.

Wenn keine POST-Auswahl vorhanden ist, wird KeyError ausgelöst. Der obige Code sucht nach KeyError und zeigt das Fragenformular mit einer Fehlermeldung erneut an, wenn keine Auswahl besteht.

Nach erfolgreicher POST-Datenverarbeitung

Dies ist nicht auf Django beschränkt, sondern wird als bewährte Methode für die Webentwicklung nach erfolgreicher Verarbeitung von POST-Daten auf die Zielseite umgeleitet.

In diesem Fall verwende ich HttpResponseRedirect von Django, um den Übergang zum Ergebnis durchzuführen.

Verwenden Sie in HttpResponseRedirect die Umkehrfunktion.

Das erste Argument der Umkehrfunktion gibt das URLconf-Muster an. Das zweite Argument gibt die für den Übergang erforderlichen Parameter an.

Ergebnisseite erstellen

Erstellen Sie abschließend eine Ergebnisseite.

polls/views/py


from django.shortcuts import render, get_object_or_404
from .models import Question, Choice
from django.http import HttpResponseRedirect, HttpResponse
from django.urls import reverse


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {
        'latest_question_list': latest_question_list,
    }
    return render(request, 'polls/index.html', context)


def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    context = {
        'question': question
    }
    return render(request, 'polls/detail.html', context)

#Ansicht diesmal hinzugefügt
def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    context = {
        'question': question
    }
    return render(request, 'polls/results.html', context)


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

Fügen Sie zunächst eine Ansicht hinzu. Der Inhalt ist sehr einfach.

Erstellen Sie als Nächstes eine Vorlage.

polls/templates/polls/results.html


<h1>{{question.question_text}}</h1>

<ul>
    {% for choice in question.choice_set.all %}
        <li>{{choice.choice_text}}&nbsp;--&nbsp;{{choice.votes}}&nbsp;vote{{choice.votes|pluralize}}</li>
    {% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
<br />
<a href="{% url 'polls:index' %}">To TOP</a>

Das Ergebnis der Abstimmung wird angezeigt, indem die Schleife um die Anzahl der Auswahlmöglichkeiten gedreht wird.

Damit sind die Funktionen der App abgeschlossen.

Verwenden Sie eine generische Ansicht

Eines der Konzepte in Python ist, dass "weniger Code gut ist". Django übernimmt diese Idee natürlich.

Lassen Sie uns eine einfachere Ansicht erstellen, indem Sie die bisher erstellten Ansichten geringfügig ändern.

Die Ansicht, die ich bisher entwickelt habe, war die Methode der Webentwicklung.

Rufen Sie Daten aus der Datenbank gemäß den über die URL übergebenen Parametern ab. ↓ Laden Sie die Vorlage. ↓ Rendern Sie die Vorlage und geben Sie sie zurück.

Da der obige Prozess äußerst allgemein ist, gibt es in Django eine Verknüpfung als allgemeine Ansicht.

Eine generische Ansicht ist eine Abstraktion gängiger Muster, mit der Sie Ihre Anwendung schreiben können, ohne Python-Code zu schreiben.

Eine generische Ansicht zu einer generischen Ansicht zu machen, ist ein Schritt weiter unten.

① URLconf konvertieren. ② Löschen Sie die alte unnötige Ansicht. ③ Stellen Sie die Gesamtansicht von Django auf die neue Ansicht ein.

Konvertieren Sie zunächst die URLconf-Einstellungen.

polls/urls.py


from django.conf.urls import url

from . import views

app_name = 'polls'

urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),  #Geändert über die IndexView-Klasse
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),  #Geändert, um die DetailView-Klasse zu durchlaufen
    url(
        r'^(?P<pk>[0-9]+)/results/$',
        views.ResultsView.as_view(),
        name='results'
    ),   #Geändert, um die DetailView-Klasse zu durchlaufen
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

Der Name des Musters, das im zweiten und dritten regulären Ausdruck übereinstimmt, wurde in geändert.

Ändern Sie als Nächstes die Ansicht.

polls/views.py


from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect
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,))
        )

Hier wird die Ansicht zur Anzeige der Vorlage klassifiziert. Das übergeordnete Element der Klasse erbt von der neu importierten generischen untergeordneten Klasse.

generic.DetailView

Für Detailseite anzeigen.

Jede Ansicht muss wissen, für welches Modell sie funktioniert. Dies wird als Modell-Proty definiert.

Außerdem soll die generische DetailView-Ansicht den Primärschlüssel von der URL mit dem Namen ** pk ** erfassen und übergeben. Deshalb habe ich es früher in URLconf auf pk geändert.

Standardmäßig verweist die generische DetailView-Ansicht auf die Vorlage `` ` / _detail.html```.

Diesmal handelt es sich um einen eindeutigen Vorlagennamen. Sie müssen die Vorlage daher explizit in der Eigenschaft template_name angeben. (Vorlagenname ist nicht erforderlich, wenn Sie gemäß den Namenskonventionen erstellen.)

Außerdem verwendet die Kontextvariable den Modellnamen.

generic.ListView

Die Namenskonvention für die Standardvorlage von ListView lautet `` ` / _list.html```.

Da dies unsere eigene Vorlage ist, verwenden wir die Eigenschaft template_name.

Außerdem wird die Liste der erfassten Daten standardmäßig in der Kontextvariablen `` ` _list``` gespeichert.

Dieses Mal verwendet die gesamte App eine Kontextvariable namens `` `latest_question_list```.

Daher wird der Name der Kontextvariablen mit der Eigenschaft `` `context_objext_name``` überschrieben.

Definieren Sie abschließend die Methode `get_queryset ()`, mit der der Wert in der Kontextvariablen gespeichert wird.

Zusammenfassung

Diesmal,

  • Formularerstellung
  • Verwendung der Universalansicht

Ich erklärte.

Die Formularerstellung unterschied sich nicht von Frameworks in anderen Sprachen, aber generische Ansichten waren etwas eigenartig.

Wie ich mich erinnere, konnte ich wie im Tutorial eine Ansicht aus der URL auswählen, eine Vorlage aus der Ansicht auswählen, sie rendern und als HttpResponse fast ohne Code zurückgeben.

Sie müssen sich daran gewöhnen, aber es lohnt sich, sich daran zu erinnern. (Am Ende wird React eine Tabelle erstellen, daher ist dies möglicherweise nicht sinnvoll ...)

Das nächste Mal möchte ich einen automatisierten Test mit der von mir erstellten Abstimmungs-App einführen.

GitHub

Serie

Recommended Posts

Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Fangen Sie mit Django an! ~ Tutorial ④ ~
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Wie fange ich mit Django an?
Django 1.11 wurde mit Python3.6 gestartet
Erste Schritte mit Django 1
Beginnen Sie mit MicroPython
Beginnen Sie mit Mezzanine
Erste Schritte mit Django 2
Der einfachste Weg, um mit Django zu beginnen
Beginnen Sie mit influxDB + Grafana
Erste Schritte mit Python Django (1)
Erste Schritte mit Python Django (4)
Erste Schritte mit Python Django (3)
Einführung in Python Django (6)
Beginnen Sie mit Python! ~ ② Grammatik ~
Erste Schritte mit Django mit PyCharm
Erste Schritte mit Python Django (5)
Beginnen Sie mit Python! ~ ① Umweltbau ~
Link, um mit Python zu beginnen
Erste Schritte mit MicroPython (unter macOS)
Wie fange ich mit Scrapy an?
Erste Schritte mit Python
Beginnen Sie mit dem maschinellen Lernen mit SageMaker
Beginnen Sie mit Python mit Blender
Erste Schritte mit dem Python-Framework Django unter Mac OS X.
Python Django Tutorial (5)
Python Django Tutorial (2)
CRUD GET mit Nuxt & Django REST Framework ②
Internationalisierung mit Django
Django Tutorial Memo
Ich habe versucht, das Entwicklungsstartverfahren von Django kurz zusammenzufassen
Python Django Tutorial (8)
CRUD GET mit Nuxt & Django REST Framework ①
Python Django Tutorial (6)
Starten Sie das Django Tutorial 1
Erste Schritte mit dem Dokumentationstool Sphinx
Beginnen wir mit TopCoder in Python (Version 2020)
CRUD mit Django
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Wie Python-Anfänger mit Progete beginnen
Python Django Tutorial (3)
[Blender x Python] Beginnen wir mit Blender Python !!
Python Django Tutorial (4)
Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)
Zubu Amateur will Python starten
[Cloud102] # 1 Erste Schritte mit Python (Teil 1 Python Erste Schritte)
Authentifizieren Sie Google mit Django
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
Starten Sie Jupyter Notebook
Zusammenfassung des Python Django-Tutorials
PDF mit Django ausgeben
Erste Schritte mit Android!
Markdown-Ausgabe mit Django
1.1 Erste Schritte mit Python