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

Я получаю сообщение об ошибке в классе 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-шаблон, который представляет / Автор / Создать

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

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

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

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

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

Спасибо

1 ответ

Решение

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

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

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

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

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 "s 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 к комментарию документов:) Надеюсь, что это помогает!

Другие вопросы по тегам