Проблема с обобщенными представлениями класса в Django
Я пытаюсь написать приложение CRUD с использованием общих представлений класса на основе Djangos. Ниже приведен код, который я написал для создания нового пользователя в db.
from django.views.generic import CreateView
from django.contrib.auth.decorators import login_required
from django.contrib import messages
class UserCreateView(CreateView):
"""
Display and accept a new user to be created in db
"""
form_class = ProfileForm
template_name = 'userdb/profile_form.html'
success_url = '/organization/users/'
def post(self, request, *args, **kwargs):
messages.success(request, "Success", extra_tags='msg')
return super(UserCreateView, self).post(request, *args, **kwargs)
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UserCreateView, self).dispatch(*args, **kwargs)
Обратите внимание, что для добавления сообщения о успехе, которое будет отображаться для пользователя, мне пришлось расширить функцию post. Я знаю, что это не очень хороший способ сделать это, поскольку, когда эта функция вызвана, она не решила, содержит ли поданная форма достоверные данные. Поэтому мой вопрос: рекомендуется ли комбинировать среду обмена сообщениями Djangos с обобщенными представлениями на основе классов?
Ответы
Ответ 1
Ответ зависит от того, что конкретно вы собираетесь делать с инфраструктурой обмена сообщениями. Если его нужно вызвать для каждого запроса get
, вам, естественно, нужно будет поместить его в метод get
(точка, где нет места для размещения этого кода).
В любом случае, похоже, что вы ищете место, которое срабатывает только тогда, когда форма действительна.
CreateView
использует ModelFormMixin
, который реализует метод form_valid
, который запускается только при успешной сохранении формы. Отлично!
def form_valid(self, form):
messages.success(self.request, "Success", extra_tags='msg')
return super(UserCreateView, self).form_valid(form)
# ModelFormMixin will now save
# FormMixin will now redirect to success_url()
# override above behavior if you need to do something with the object