Ich erhalte eine Fehlermeldung in meiner Klasse AuthorCreateForm, wenn ich mein Formular abschicke. NameError self ist nicht definiert
Wie verwende ich ein CreateForm?
Ich habe eine Klasse in meiner Author.py-Datei erstellt
from Django.views.generic import TemplateView, ListView, CreateView
from books.models import Author, Publisher, Book
from books.forms import AuthorForm
class AuthorCreateView(CreateView):
objAuthorForm = AuthorForm(self.request.POST)
if(objAuthorForm.save()):
success = "Form saved!"
else:
error = "There was an error!"
und ich habe eine HTML-Vorlage, die unter/Author/Create eingereicht wird
und ich habe die folgende Zeile in meiner urls.py
('^authors/create/$', Author.AuthorCreateView.as_view()),
Ich rendere das Formular unter dieser URL
('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),
Ich finde die klassenbasierten Ansichten verwirrend. Hat jemand ein gutes Tutorial, wie man es für CRUD-Operationen verwendet?
Vielen Dank
Was Sie haben, ist ein python Fehler - self
ist nicht definiert. self
bezieht sich im Allgemeinen auf die Klasseninstanz selbst auf Klassenmethoden.
Wie auch immer, ich stimme zu, es ist brandneu und nicht so dokumentiert. Ich halte es an dieser Stelle für absolut wichtig, auf die Quelle zu schauen.
Um mit klassenbasierten Ansichten vertraut zu werden, würde ich mit der Unterklasse Django.views.generic.base.View
Beginnen, die nur einige Methoden implementiert, nämlich den Versuch, eine Funktion für die Klasse basierend auf der Anforderungsmethode (post, get, head, -) aufzurufen. schau auf die Quelle).
Hier ist beispielsweise der erste Schritt, um die Ansichtsfunktionen durch die neuen Ansichtsklassen zu ersetzen:
class MyClassBasedView(View):
def get(self, request):
# behave exactly like old style views
# except this is called only on get request
return http.HttpResponse("Get")
def post(self, request):
return http.HttpResponse("Post")
(r'^foobar/$', MyClassBasedView.as_view())
Zurück zu Ihrer spezifischen Frage:
Alles, was TemplateView.as_view()
tut, ist das Rendern der Vorlage - CreateView
ist eine Kombination aus mehreren anderen Klassen, die ModelForms
und das Rendern von Vorlagen (TemplateView
) verarbeiten.
Also, für ein sehr einfaches Beispiel, schau in die Dokumentation für welche Klasse mixins
von CreateView
verwendet wird.
Wir sehen, dass es TemplateResponseMixin
, ModelFormMixin
und ProcessFormView
implementiert, die jeweils eine Liste von Methoden für diese Klassen enthalten.
Auf der einfachsten Ebene müssen Sie CreateView
's ModelFormMixin
mit dem Modell oder der benutzerdefinierten ModelForm-Klasse versehen wie hier dokumentiert.
Ihre CreateView
Klasse würde ungefähr so aussehen
class AuthorCreateView(CreateView):
form_class = AuthorForm
template_name = 'author_new.html'
success_url = 'success'
Rufen Sie diese drei Kernattribute in Ihren URLs auf.
('^authors/create/$', Author.AuthorCreateView.as_view()),
Wenn Sie die Seite rendern, wird Ihre ModelForm als form
an die Vorlage übergeben. Dabei wird der Formularüberprüfungsschritt (Übergabe von request.POST
/Erneutes Rendern, falls ungültig) ausgeführt und form.save()
und Weiterleitung zum success_url
.
Beginnen Sie mit dem Überschreiben der für mixins
dokumentierten Methoden, um das Verhalten anzupassen.
Denken Sie daran, dass Sie einfach ein HttpResponse
von einer dieser Methoden zurückgeben müssen, genau wie bei jeder normalen Ansichtsfunktion.
Beispiel für das Überschreiben von form_invalid
, Das in ModelFormMixin
dokumentiert ist:
class AuthorCreateView(CreateView):
form_class = AuthorForm
template_name = 'author_new.html'
success_url = 'success'
def form_invalid(self, form):
return http.HttpResponse("form is invalid.. this is just an HttpResponse object")
Dieses Überschreiben pro Methode wird immer nützlicher, je weiter Ihre Formulare fortgeschritten sind. Schließlich können Sie riesige Formulare mit einer Handvoll Codezeilen erstellen und nur das überschreiben, was erforderlich ist.
Angenommen, Sie möchten Ihre benutzerdefinierten Formularparameter wie das Objekt request
übergeben (sehr häufig, wenn Sie Zugriff auf den Benutzer im Formular benötigen): Sie müssen lediglich get_form_kwargs
Überschreiben.
class MyFormView(FormView):
def get_form_kwargs(self):
# pass "user" keyword argument with the current user to your form
kwargs = super(MyFormView, self).get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
Klassenbasierte Ansichten sind ein hervorragendes Beispiel für die Verwendung intelligenter Klassen. Es gab mir eine großartige Einführung in das Erstellen eigener Mixins für Views und python Klassen im Allgemeinen. Es spart unzählige Stunden.
Wow, das hat lange gedauert. Zu denken, es begann als bloße URL zum Dokumentenkommentar :) Hoffe, das hilft!