Подтвердить что ты не робот

Проблема с обобщенными представлениями класса в 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 с обобщенными представлениями на основе классов?

4b9b3361

Ответ 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