Подтвердить что ты не робот

Как использовать 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-шаблон, который отправляет /Author/Create

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

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

Я представляю форму по этому URL

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

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

Спасибо

4b9b3361

Ответ 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

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