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