13

我正在尝试使用基于 Django 类的通用视图编写一个 CRUD 应用程序。以下是我为在数据库中创建新用户而编写的代码。

  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 功能。我知道这不是一个好方法,因为当这个函数被调用时,它不会决定提交的表单是否包含有效数据。所以我的问题是,是否有将 Django 消息传递框架与基于类的通用视图相结合的推荐方式?

4

1 回答 1

16

答案取决于您希望使用消息传递框架具体做什么。如果需要为每个get请求调用它,您自然需要将其放入get方法中(重点是没有一个正确的位置可以放置此代码)。

无论如何,听起来您正在寻找一个仅在表单有效时触发的地方。

CreateView使用ModelFormMixinwhich 实现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
于 2011-06-21T06:23:13.633 回答