Django中基于类的泛型视图问题

13 投票
1 回答
3407 浏览
提问于 2025-04-16 19:58

我正在尝试使用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的消息框架与基于类的通用视图结合起来?

1 个回答

16

这个答案其实要看你具体想用这个消息框架做什么。如果你希望在每次处理 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

撰写回答