Как использовать CreateView с ModelForm - PullRequest
51 голосов
/ 25 апреля 2011

Я получаю сообщение об ошибке в классе AuthorCreateForm при отправке формы.NameError self не определено

Как использовать CreateForm?

Я создал класс в своем файле Author.py

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

и у меня есть HTML-шаблонкоторый отправляет / Author / Create

, и у меня есть следующая строка в моем urls.py

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

Я отображаю форму по этому URL

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

Iсмущает взгляды на основе классов, есть ли у кого-нибудь хорошее руководство по использованию его для операций CRUD?

Спасибо

1 Ответ

183 голосов
/ 25 апреля 2011

Имеется ошибка Python - self не определено. self обычно относится к самому экземпляру класса в методах класса.

В любом случае, я согласен, это новый шлепок, а не то, что задокументировано. Я думаю, что смотреть на источник является абсолютно ключевым моментом.

Чтобы освоиться с представлениями на основе классов, я бы начал с подкласса django.views.generic.base.View, который реализует только несколько методов, а именно, пытается вызвать функцию в классе на основе метода запроса (post, get, head, - посмотрите на источник).

Например, вот первый шаг для замены функций представления новыми классами представления:

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

Вернуться к вашему конкретному вопросу:

Все, что TemplateView.as_view() делает, это представляет шаблон - CreateView представляет собой комбинацию нескольких других классов, которые обрабатывают ModelForms и отображение шаблона (TemplateView).

Итак, для очень простого примера, посмотрите документы , чтобы узнать, какой класс mixins используется CreateView.

Мы видим, что он реализует TemplateResponseMixin, ModelFormMixin и ProcessFormView, каждый из которых содержит список методов для этих классов.


Самый простой CreateView

На самом базовом уровне предоставьте CreateView ModelFormMixin с моделью или пользовательским классом ModelForm , как описано здесь.

Ваш CreateView класс будет выглядеть примерно так:

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

С этими тремя основными атрибутами, назовите его в своих URL.

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

Визуализируйте страницу, и вы увидите, что ваша ModelForm передана в шаблон как form, обрабатывая этап проверки формы (передавая request.POST / re-render, если он недействителен), а также вызывая form.save() и перенаправляя к success_url.


Начать переопределение методов класса

Чтобы настроить поведение, начните переопределять методы, задокументированные для mixins.

Помните, что вам просто нужно вернуть HttpResponse из одного из этих методов, как и в любой обычной функции просмотра.

Пример переопределения form_invalid, задокументированный в 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")

Это переопределение для каждого метода становится чрезвычайно полезным, так как ваши формы становятся более продвинутыми и, в конечном итоге, позволяют создавать огромные формы с помощью нескольких строк кода, переопределяя только то, что необходимо.

Скажем, вы хотите передать пользовательские параметры формы, такие как объект request (очень часто, если вам нужен доступ к пользователю в форме): вам просто нужно переопределить 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

Представления на основе классов являются ярким примером использования интеллектуальных классов. Это дало мне хорошее представление о создании моих собственных миксинов для представлений и классов Python в целом. Это экономит бесчисленные часы.

Ух ты, это долго. Чтобы думать, что это началось как простой URL к комментарию к документам :) Надеюсь, что это помогает!

...