2011-06-21 121 views
13

我想使用基于Djangos类的通用视图编写一个CRUD应用程序。以下是我写的用于在db中创建新用户的代码。Django中基于类的通用视图的问题

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消息传递框架与基于类的通用视图相结合的方式?

回答

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 
+0

我以前试过实现'form_valid'函数,但它没有工作,因为我找不到访问请求对象的方法。这很好,非常感谢你! – vimukthi

+0

np!很高兴它有帮助 –

相关问题