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