Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
def form_valid(self, form):
Post.objects.create(**form.cleaned_data)
return redirect(self.get_success_url())
def form_valid(self, form):
# Мы используем ModelForm, а его метод save() возвращает инстанс
# модели, связанный с формой. Аргумент commit=False говорит о том, что
# записывать модель в базу рановато.
instance = form.save(commit=False)
# Теперь, когда у нас есть несохранённая модель, можно ей чего-нибудь
# накрутить. Например, заполнить внешний ключ на auth.User. У нас же
# блог, а не анонимный имижборд, правда?
instance.user = request.user
# А теперь можно сохранить в базу
instance.save()
return redirect(self.get_success_url())
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
super(CreatePost, self).dispatch(request, *args, **kwargs)
Это жесть и чревато ошибками. Лучше так
И ещё: не надоело в каждой вьюхе писать что-то такое?
Разумеется если вам потребуются соответсвующие проверки на наличие авторизации у пользователей или соответствующих прав, то вы можете сделать это используя декораторы для метода dispatch или добавить свою логику проверки:
class DecoratorChainingMixin(object):
def dispatch(self, *args, **kwargs):
decorators = getattr(self, 'decorators', [])
base = super(DecoratorChainingMixin, self).dispatch
for decorator in decorators:
base = decorator(base)
return base(*args, **kwargs)
class MyView(DecoratorChainingMixin, UpdateItem):
form_class = ItemForm
model = Item
decorators = [login_required, never_cache, i_cherta_lysogo_v_stupe(foo='bar')]
class UserPassesTestMixin(object):
def user_passes_test(self, user):
return user.is_authenticated()
def user_failed_test(self):
return redirect(LOGIN_URL)
def dispatch(self, request, *args, **kwargs):
if not self.user_passes_test(request.user):
return self.user_failed_test()
return super(UserPassesTestMixin, self).dispatch(request, *args, **kwargs)
user_passes_test. В том маловероятном случае, если не устраивает редирект на страницу логина, можно перекрыть и user_failed_test.-class DecoratorChainingMixin(object):
+class ClassBasedViewMiddleware(object):
Немного подробностей про Class Based Views, ч.4