Проблема с базовыми представлениями на основе классов в Django - PullRequest
13 голосов
/ 21 июня 2011

Я пытаюсь написать приложение CRUD, используя общие представления на основе классов Djangos.Ниже приведен код, который я написал для создания нового пользователя в БД.

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

16 голосов
/ 21 июня 2011

Ответ зависит от того, что конкретно вы собираетесь делать со структурой обмена сообщениями.Если его нужно вызывать для каждого 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
...