Es ist ein Material für Lernsitzungen Dieses Mal werde ich Form etwas abseits des ursprünglichen Tutorials erklären. Bevor ich das Formular betrete, werde ich ein wenig über das Aktualisieren von Django und Namespace der URL einführen.
Tutorial Tutorial Tutorial 1 Tutorial 2 Tutorial 3 Tutorial 4
Außerdem habe ich bis zum letzten Mal django1.8 erklärt, aber seit django1.9 veröffentlicht wurde, während ich Updates übersprungen habe. In den folgenden Tutorials erklären wir Django 1.9. Selbst wenn Sie die Version von Django von 1.8 auf 1.9 ändern, gibt es keinen besonderen Unterschied im Inhalt der Tutorials 1 bis 4.
Quelle → ee195d1
Sie können auf den neuesten Django (1.9.2 vom 20. Februar 2016) aktualisieren, indem Sie den folgenden Befehl in die Befehlszeile eingeben.
Wenn Sie eine virtuelle Umgebung verwenden, vergessen Sie nicht, die virtuelle Umgebung mit "workon" zu aktivieren.
(tutorial)$ pip install --upgrade django
(tutorial)$ pip install --upgrade django
Collecting django
Using cached Django-1.9.2-py2.py3-none-any.whl
Installing collected packages: django
Found existing installation: Django 1.8.6
Uninstalling Django-1.8.6:
Successfully uninstalled Django-1.8.6
Successfully installed django-1.9.2
Wenn es normal endet, wird der bereits installierte Django (in diesem Fall 1.8.6) wie oben beschrieben deinstalliert und der neueste Django installiert.
requirements.txt In diesem Tutorial ist Django die einzige externe Bibliothek, die bisher verwendet wurde, aber die Anzahl der in Zukunft verwendeten verwandten Bibliotheken wird stetig zunehmen. Welche Bibliothek benutzen Sie gerade? , Ist die Version der Bibliothek dieselbe? Es ist schwierig, jedes Mal zu überprüfen. Glücklicherweise hat Python ein Paketverwaltungssystem namens "pip" und eine virtuelle Umgebung namens "virtualenv". Sie werden nicht oft unter diesem Problem leiden.
Geben Sie den folgenden Befehl in die Shell ein, um eine Liste der in der aktuellen Umgebung verwendeten Bibliotheken abzurufen.
(tutorial)$ pip freeze
Django==1.9.2
wheel==0.24.0
Gemäß der Konvention in Python wird dieser Inhalt als "require.txt" ausgegeben. Eine andere Person kann die erforderlichen Bibliotheken durch Importieren dieser Datei installieren. Wie Sie sehen können, hat der Ausgabeinhalt auch eine Versionsnummer wie 1.9.2, sodass Sie sich keine Gedanken über Fehlfunktionen aufgrund unterschiedlicher Versionen machen müssen.
Ich wollte es in das Tutorial aufnehmen, habe es aber nicht erstellt, also habe ich es mit commit hinzugefügt:
ee195d1
.
(tutorial)$ pip freeze > requirements.txt
Leiten Sie einfach den Inhalt von "pip freeze" um. Im Fall von Django wird empfohlen, es in dieselbe Hierarchie wie "manage.py" zu setzen.
Verwenden Sie zum Importieren den Befehl pip install -r
.
Nachdem Sie bestätigt haben, dass es sich in der Umgebung, die Sie importieren möchten, nach "-r" um "Workon" handelt
Beschreiben Sie den Pfad zu der Datei, die Sie importieren möchten (require.txt
).
(tutorial)$ pip install -r requirements.txt
Wenn Sie bereits eine Bibliothek installiert haben und deren Version aktualisieren möchten
(tutorial)$ pip install -U -r requirements.txt
Sie benötigen die Option -U wie>. Als ich es zur Hand versuchte, schien es jedoch, dass wenn die Pip-Version8.0.2
ist, sie aktualisiert wird, ohne sie hinzuzufügen.
Quelle → bba5e4f
In Tutorial 3 habe ich die Erklärung der URL-Namespace-Konvertierung übersprungen. In Anbetracht der Zukunft ist es zweckmäßig, sie zu trennen. Legen Sie daher den Namespace in der Umfrage-URL fest. Um es hinzuzufügen, fügen Sie einfach "Namespace" zum Argument der Funktion "include" hinzu.
tutorial/urls.py
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^polls/', include('polls.urls')),
]
↓ Fügen Sie dem Include-Argument von Umfragen einen Namespace hinzu
tutorial/urls.py
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^polls/', include('polls.urls', namespace='polls')),
]
Achten Sie darauf, die Position der schließenden Klammer nicht als Argument für die URL-Funktion zu verwechseln
Wenn Sie einen Namespace festlegen, können Sie eine URL in Form von "Namespace: hoge" abrufen. Der Namespace kann auch hierarchischer geschrieben werden, z. B. "api: polls: create". Ich habe das Präfix "poll_" zum Namen des Include-Ziels "polls / urls.py" hinzugefügt. Wenn Sie einen Namespace verwenden, ist dieser nicht erforderlich. Löschen Sie ihn daher.
polls/urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'(?P<pk>\d+)/$', views.detail, name='poll_detail'),
url(r'(?P<pk>\d+)/vote$', views.vote, name='poll_vote'),
url(r'(?P<pk>\d+)/results$', views.results, name='poll_results'),
]
↓ Da der Namespace abgeschnitten ist, wird das Präfix "poll_" nicht mehr benötigt.
polls/urls.py
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'(?P<pk>\d+)/$', views.detail, name='detail'),
url(r'(?P<pk>\d+)/vote$', views.vote, name='vote'),
url(r'(?P<pk>\d+)/results$', views.results, name='results'),
]
In django 1.9 schreiben Sie den Namespace-Namen nicht in das include-Argument in
tutorial / urls.py
Sie können es auch festlegen, indem Sie "app_name =" polls "in" polls / urls.py "schreiben. https://docs.djangoproject.com/en/1.9/releases/1.9/#passing-a-3-tuple-or-an-app-name-to-include
Mit dieser Änderung wird die URL nun vom Namen zu "polls: detail" anstelle von "poll_detail" gezogen. Bitte überprüfen Sie den Quellendifferenz für das korrigierte Teil.
Durch das Ausschneiden des Namespace wird die "Umfragen" -App stärker vom "Tutorial" -Projekt getrennt und ist in anderen Projekten einfacher zu verwenden.
Wenn bei der vorherigen Methode eine andere Anwendung im selben Projekt der URL einen Namen wie "poll_detail" gibt, tritt ein Fehler auf.
Sie müssen vorsichtig mit den URL-Namen aller vom Projekt verwalteten Anwendungen sein.
Verwenden Sie andererseits den Namespace, um Konflikte mit dem Namespace in root urls.py (tutorial / urls.py
) zu vermeiden.
Du musst nur vorsichtig sein.
Kommen wir nun endlich zur Geschichte von Form. Das Formular wird verwendet, um Daten in einem bestimmten Format vom Client an den Server zu übergeben, wie die englische Übersetzung von "Formular, Antragsformular" bedeutet. In Tutorial 4 wurde das Formular direkt in die Vorlage geschrieben, und die Verarbeitung nach dem Empfang wurde auf der Ansichtsseite geschrieben. Die Vorlage und die Ansicht entsprechen jedoch der Ansicht und dem Controller im MVC-Modell, und es ist nicht gut, wenn die Logik hier enthalten ist. Im aktuellen Format wird auch die Anzeige des Optionsfelds in der Vorlage beschrieben und seine Validierung (Feststellung, ob die ausgewählten Daten korrekt sind). Weiterhin wird in der Ansicht die Verarbeitung (Voting-Verarbeitung) unter Verwendung des Eingabewerts beschrieben. Da jedoch die Eingabeelemente, die Validierung für sie und die Verarbeitung unter Verwendung der Daten eng miteinander verbunden sind. Ich möchte diese gemeinsam behandeln. Die Formularklasse wird in Django und allgemeinen Eingaben (Text, Auswahlliste, Optionsfeld usw.) und vorbereitet Wir stellen den Validator zur Verfügung (Eingabeprüfung).
Die Form-Klasse erleichtert das Schreiben von Tests für Honke Tutorial 5. Sie können die Anzahl der Eingabeelemente leicht erhöhen und sie an anderen Stellen problemlos wiederverwenden. Darüber hinaus kann durch die Verknüpfung mit der klassenbasierten Allzweckansicht die Beschreibung der Ansicht weiter reduziert und verständlicher gemacht werden.
Quelle → 34698a1
Lassen Sie uns zunächst versuchen, ein Formular zu erstellen.
Erstellen Sie im Anwendungsordner eine Datei mit dem Namen forms.py
und definieren Sie die Form-Klasse darin.
Legen Sie für die Form-Klasse die Feldklasse als Mitglied fest.
Bitte beziehen Sie sich auf das offizielle Dokument für die Feldklasse, die eingestellt werden kann.
https://docs.djangoproject.com/en/1.9/ref/forms/fields/
Lassen Sie uns vorerst CharField festlegen, ein Feld zur Eingabe von Zeichen. CharField muss die maximale Anzahl von Zeichen (max_length) als erforderliches Argument angeben. Legen Sie daher vorerst 100 Zeichen fest.
polls/forms.py
from django import forms
class MyForm(forms.Form):
text = forms.CharField(max_length=100)
Lassen Sie uns die Ausgabe überprüfen, um zu sehen, was passiert, wenn wir dies schreiben. Starten Sie die Python-Shell mit der Shell "./manage.py", erstellen Sie eine Instanz der zuvor erstellten Form-Klasse und erstellen Sie sie. Lass es uns drucken.
$ ./manage.py shell
(InteractiveConsole)
>>> from polls.forms import MyForm
>>> f = MyForm()
>>> print(f)
<tr><th><label for="id_text">Text:</label></th><td><input id="id_text" maxlength="100" name="text" type="text" /></td></tr>
Sie können sehen, dass das Texttyp-Eingabe-Tag als Ausgabe ausgegeben wird. Da der Feldname auf "Text" gesetzt ist, können Sie auch bestätigen, dass die Zeichenfolge "Text" als Bezeichnung angezeigt wird.
Quelle → 34f4914
Als nächstes erstellen wir die erstellte Formularklasse HTML. Schreiben Sie zunächst die Formularerstellung und übergeben Sie sie in views.py an die Vorlage.
polls/views.py
from .forms import MyForm
def form_test(request):
form = MyForm()
return render(request, 'polls/form.html', {
'form': form,
})
Als nächstes bereiten wir eine Vorlage vor.
Da wir den Vorlagenpfad polls / form.html
angegeben haben, ist der Speicherort der Datei
Es ist polls / templates / polls / form.html
.
polls/templates/polls/form.html
<html>
<body>
<form>
{{ form }}
</form>
</body>
</html>
Jetzt sollte die folgende Zeichenfolge in der Shell in {{form}}
bestätigt werden.
<tr><th><label for="id_text">Text:</label></th><td><input id="id_text" maxlength="100" name="text" type="text" /></td></tr>
Verbinden Sie abschließend die Funktion form_test und die URL.
Fügen wir eine URL zu polls / urls.py
hinzu.
polls/urls.py
urlpatterns = [
...
url(r'^form$', views.form_test),
...
]
Starten Sie nach dem bisherigen Schreiben den Testserver mit ./manage.py runserver
und überprüfen Sie ihn mit einem Browser.
Die URL lautet "http: // localhost: 8000 / polls / form".
Bildschirm
Es ist eine mörderische Szene, aber vorerst kann man sehen, dass es eine Box für die Eingabe gibt.
HTML-Quelle
Die HTML-Quelle sieht so aus.
Wie erwartet wurde der Teil {{form}}
ersetzt.
Quelle → 06c8422
Nun, das Eingabefeld wurde erstellt, aber auf der Serverseite gibt es noch keinen Empfangsprozess. Beschreiben Sie beim Senden von Daten an den Server mit HTML ** wo ** ** wie ** Daten im Tag