【问题标题】:Passing 'success_url' to CBV Django-Registration将“success_url”传递给 CBV Django-Registration
【发布时间】:2013-12-05 04:46:48
【问题描述】:

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

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 并放入自定义逻辑?

【问题讨论】:

  • 我确实通过提供一个新的 success_url 覆盖了 ActivationView,但我在 urls.py 中有错误的路径。如果 'auth/' 是 django_registration 的路径,那么 'auth/activate// 应该是我们自定义的 ActivationView 的路径

标签: python django django-authentication django-registration


【解决方案1】:

正如其他人所证实的,我能够通过继承 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 文件中指定的内容:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的澄清,希望您的拉取请求获得批准!看起来这肯定会解决这个问题。
    【解决方案3】:

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

    默认情况下,此方法未实现,因此除了继承 ActivationView 并自己实现 get_success_url 之外,您别无选择。

    【讨论】:

    • 我认为如果ActivationView 类包含get_success_url 的基本实现,类似于在编辑CBV 上的实现,以及success_url = None 声明,我认为包的设计会更好,以便关键字as_view 可以,但不行。
    • 感谢您的确认,我将添加一个子类化 ActivationView 的示例,以供其他人参考。
    猜你喜欢
    • 2017-08-31
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 2014-05-02
    • 2013-06-29
    • 2016-03-01
    • 2015-11-27
    相关资源
    最近更新 更多