55 votes

Comment utiliser CreateView avec un ModelForm

J'obtiens une erreur dans ma classe AuthorCreateForm quand je soumettre mon formulaire. NameError l'auto n'est pas défini

Comment puis-je utiliser un CreateForm?

J'ai créé une classe dans mon Author.py fichier

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!"

et j'ai un modèle html qui se soumet à /Auteur/Créer

et j'ai la ligne suivante dans mon urls.py

('^authors/create/$', Author.AuthorCreateView.as_view()),

J'ai rendu le formulaire à cette adresse

('^authors/new/$', TemplateView.as_view(template_name="author_new.html")),

Je trouve la classe des vues basées sur la confusion, quelqu'un aurait-il un bon tutoriel sur la façon de l'utiliser pour les opérations CRUD?

Merci

198voto

Yuji 'Tomita' Tomita Points 46106

Ce que vous avez est un python d'erreur -- self n'est pas défini. self est généralement ce qui fait référence à l'instance de la classe elle-même sur les méthodes de la classe.

De toute façon, je suis d'accord, c'est flambant neuf et non documenté. Je pense en regardant la source est absolument essentiel à ce stade.

Pour obtenir à l'aise avec la classe de base de points de vue, j'aimerais commencer par dériver django.views.generic.base.View, ce qui implémente seulement quelques méthodes, à savoir la tentative d'appeler une fonction de la classe basée sur la méthode de la requête (post, get, head, - chercher à la source).

Par exemple, voici la première étape pour remplacer les fonctions d'affichage avec les nouvelles classes de vue:

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

De retour à votre question:

Tous TemplateView.as_view() n'est rendre le modèle - CreateView est une combinaison de plusieurs autres classes qui gèrent ModelForms et le modèle de rendu (TemplateView).

Ainsi, pour un exemple très simple, regardez la documentation de la classe mixins sont utilisés par CreateView.

Nous voyons qu'il implémente TemplateResponseMixin, ModelFormMixin, et ProcessFormView, chacun contenant une liste des méthodes de ces classes.


Les plus de base CreateView

Au niveau le plus élémentaire, fournissent CreateViews' ModelFormMixin avec le modèle ou la coutume ModelForm classe , comme indiqué ici.

Votre CreateView classe ressemblerait à quelque chose comme ce qui suit

class AuthorCreateView(CreateView):
    form_class = AuthorForm
    template_name = 'author_new.html'
    success_url = 'success'

Avec ces 3 attributs de base défini, appelez dans votre Url.

('^authors/create/$', Author.AuthorCreateView.as_view()),

Le rendu de la page et vous verrez que votre ModelForm passé pour le modèle en tant que form, la manipulation de la validation du formulaire de l'étape (passant en request.POST / re-rendu s'il est invalide), ainsi que l'appel à la form.save() et de la rediriger vers le success_url.


Début surchargeant les méthodes de la classe

Pour personnaliser le comportement, commencer surchargeant les méthodes décrites pour l' mixins.

Rappelez-vous que vous avez simplement besoin de retourner un HttpResponse à partir de l'une de ces méthodes, tout comme toute la vue normale de la fonction.

Exemple primordial form_invalid documentée en ModelFormMixin:

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

Cette par-la redéfinition de méthode commence à devenir extrêmement utile que vos formulaires de croître plus avancés et, finalement, permet de construire d'énormes formes avec une poignée de lignes de code, en remplaçant seulement ce qui est nécessaire.

Dites que vous souhaitez transmettre votre formulaire personnalisé des paramètres tels que l' request objet (très commun, si vous avez besoin d'accéder à l'utilisateur dans le formulaire): vous devez simplement remplacer get_form_kwargs.

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

Classe de vues sont un brillant exemple de smart classe d'utilisation. Il m'a donné un grand intro vers la création de ma propre mixin pour les vues et les classes python en général. Il est de sauver un nombre incalculable d'heures.

Wow ça a été long. À penser qu'il a commencé comme une simple URL de la documentation commentaire :) j'Espère que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X