将'success_url'传递给CBV Django-Registration

时间:2013-11-20 22:45:53

标签: python django django-authentication django-registration

我想将 success_url 传递给Django注册中基于类的ActivationView,例如基于函数的视图的this answer封面和RegistrationView的this answer封面。到目前为止我尝试过的是不成功的:

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

返回“TypeError: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并将自定义逻辑放入最佳选择?

3 个答案:

答案 0 :(得分:1)

您确实只能将现有属性传递给as_view()。因此,查看source of django-registration,视图没有success_url属性,但通过调用self.get_success_url(...)获取其值。

默认情况下,此方法未实现,因此除了子类化ActivationView和自己实现get_success_url之外别无选择。

答案 1 :(得分:1)

我认为你必须对视图进行子类化并覆盖get_success_url方法。

我打开pull request 57以启用将success_url设置为类属性,但尚未合并。

答案 2 :(得分:0)

正如其他人所证实,我能够通过继承ActivationView并重写get_success_url()和activate()方法来解决这个问题:

"""
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

在urls.py文件中设置正确的URL以覆盖将由django-registration调用的默认ActivationView也很重要。需要记住的一个怪癖是,django-registration将根据auth.urls的文件路径设置其URL,而不是您在应用程序的urls.py文件中指定的URL:

"""
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')),
)