webentwicklung-frage-antwort-db.com.de

Wie verwende ich CreateView mit einem ModelForm

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

51
iJK

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.


Das grundlegendste CreateView

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, die Klassenmethoden zu überschreiben

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!

184