1

我有一种情况需要将已经登录的用户从登录页面重定向到另一个页面。我已经看到有人提到这可以通过有意义的装饰器来完成,但我对使用它们还很陌生。但是,我正在使用 django 登录和第三方视图(来自 django-registration)。我不想更改 django.contrib.auth 或 django-registration 中的任何代码。如何将装饰器应用于不被修改的视图以获得所需的行为。

提前致谢!

更新:我发现我错误地将登录功能与注册模块相关联。django-registration 与此问题无关。但是,我仍然需要能够覆盖默认 login() 行为。有什么想法吗?

4

2 回答 2

6

还有三种方法可以做到这一点,尽管您需要使用自己的 urlconf 来完成这些:

  1. 直接在 urlconf 中将装饰器添加到视图中:

    ...
    (regexp, decorator(view)),
    ...
    

    不过,您需要将视图和装饰器导入 urlconf,这就是我不喜欢这个的原因。我希望在我的 urls.py 中尽可能少地导入。

  2. 将视图导入<app>/views.py并在其中添加装饰器:

    import view
    
    view = decorator(view)
    

    很像 Vinay 的方法,虽然更明确,因为你需要一个 urlconf。

  3. 将视图包装在新视图中:

    import view
    
    @decorator
    def wrapperview(request, *args, **kwargs):
        ... other stuff ...
        return view(request, *args, **kwargs)
    

    当您需要更改通用视图时,最后一个非常方便。无论如何,这就是我经常做的事情。

每当您使用 urlconf 时,模式的顺序很重要,因此您可能需要随机选择首先调用哪个模式。

于 2009-10-30T12:21:38.773 回答
2

如果您有装饰器功能并且您知道要装饰 django-registration 中的哪个视图,您可以这样做

registration.view_func = decorator_func(registration.view_func)

django-registration 中的模块在哪里,registration它包含你要装饰的视图函数,view_func 你要装饰的视图函数,decorator_func是装饰器。

于 2009-10-30T12:01:43.790 回答