2011-06-21 69 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!很高興它有幫助 –

相關問題