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