2013-11-20 50 views
0

我想一個success_url傳遞到基於類的ActivationView在Django註冊像this answer涵蓋了基於功能的意見和this answer涵蓋RegistrationView。什麼迄今已成功我曾嘗試:傳遞「success_url」到CBV Django的註冊

url(r'^activate/(?P<activation_key>\w+)/$', 
    ActivationView.as_view({'success_url':'/activation_routing'}), 
    name='registration_activate',        
    ), 

返回 「類型錯誤:as_view()恰恰1個參數(2給出)」 我自己也嘗試

和:

url(r'^activate/(?P<activation_key>\w+)/$', 
    ActivationView.as_view(success_url='/activation_routing'), 
    name='registration_activate',        
    ), 

返回「TypeError:ActivationView()收到無效關鍵字'success_url'。as_view只接受已經屬於該類的參數。」

我覺得我錯過了基於類的視圖,或者是繼承ActivationView並將自定義邏輯放入我最好的賭注?

回答

1

您確實只能將現有屬性傳遞給as_view()。因此,查看source of django-registration,該視圖沒有success_url屬性,但它通過調用self.get_success_url(...)來獲取其值。

默認情況下,此方法未實現,因此您除了子類ActivationView和自己實現get_success_url之外別無選擇。

+0

我覺得包會,如果能更好地設計'ActivationView'類包含'get_success_url'的基本實現,類似於在編輯CBV上發現的類型,以及'success_url = None'聲明,以便關鍵字as_view'可以工作,但不會。 –

+0

感謝您的確認,我將添加一個ActivationView子類的示例,以供其他人蔘考。 – lightstrike

1

我認爲你必須繼承該視圖並覆蓋get_success_url方法。

我打開pull request 57來啓用將success_url設置爲類屬性,但尚未合併。

+0

感謝您的澄清,希望您的拉動請求獲得批准!絕對看起來像這樣可以解決這個問題。 – lightstrike

0

正如其他人證實,我能夠通過繼承ActivationView並重寫get_success_url(來解決這個)和激活()方法:

""" 
views.py 
"""  

from registration.views import ActivationView 

class CustomActivation(ActivationView):       
    def activate(self, request, *args, **kwargs):     
     return True 

    def get_success_url(self, request, user): 
     success_url = # insert success URL here 
     return success_url 

同樣重要的是設置正確的URL在你的urls.py文件覆蓋將由django-registration調用的默認ActivationView。一個怪癖要記住的是,Django的註冊將根據auth.urls的文件路徑,並設置其網址不是你在你的應用程序的urls.py文件中指定的內容:

""" 
urls.py 
""" 

from yourapp.views import CustomActivation 

urlpatterns += patterns('', 
    url(r'^user_settings/', include('auth.urls')), 
    url(r'^user_settings/activate/(?P<activation_key>\w+)/$', 
     CustomActivation.as_view(), 
     name='registration_activate', 
     ), 
    # will still set registration URLs under user_settings! 
    url(r'^accounts/', include('registration.backends.default.urls')), 
)