Как использовать CreateView с ModelForm

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

Как использовать 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")),

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

Спасибо


person iJK    schedule 24.04.2011    source источник


Ответы (1)


У вас есть ошибка 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

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

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

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

Установив эти 3 основных атрибута, вызовите их в своих URL-адресах.

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

Визуализируйте страницу, и вы увидите, что ваша ModelForm передается шаблону как form, обрабатывая этап проверки формы (передавая request.POST/перерисовывая, если недействителен), а также вызывая 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-адрес комментария документации :)

person Yuji 'Tomita' Tomita    schedule 25.04.2011
comment
Организация, разрешенная классами, просто потрясающая! Я не знаю, почему я никогда не создавал представление класса. - person Yuji 'Tomita' Tomita; 25.04.2011
comment
Примером того, как распаковать дополнительный kwargs на конце forms.py, является здесь. - person Jheasly; 08.09.2016