【问题标题】:Customized views with django-registration使用 django-registration 自定义视图
【发布时间】:2011-08-31 06:00:50
【问题描述】:

我需要对 django-registration 默认视图进行非常简单的修改——要求某些视图仅在用户未通过身份验证时显示。例如,如果我已登录,我不希望用户能够再次访问 /register 页面。

所以,我认为这里的想法是我想从 django-registration 继承 register 视图。这只是我不确定如何进行的地方。这是正确的方向吗?我应该在这里测试用户的身份验证状态吗?欢迎提示和建议!

编辑

我认为这是正确的轨道:Django: Redirect logged in users from login page

编辑 2

解决方案:

创建另一个应用程序,例如custom_registration,并编写这样的视图(我的也使用自定义表单):

from registration.views import register
from custom_registration.forms import EduRegistrationForm

def register_test(request, success_url=None,
             form_class=EduRegistrationForm, profile_callback=None,
             template_name='registration/registration_form.html',
             extra_context=None):
    if request.user.is_authenticated():
        return HttpResponseRedirect('/')
    else:
        return register(request, success_url, form_class, profile_callback, template_name, extra_context)

我必须使用相同的函数参数,否则只包含测试,如果我们通过它,继续主函数。

也不要忘记把它放在你的 URLConf 中(同样,这也包括一些关于我的自定义表单的东西):

顶级 URLConf

(r'^accounts/', include('custom_registration.urls')),
(r'^accounts/', include('registration.urls')),

custom_registration.views

from django.conf.urls.defaults import *
from custom_registration.views import register_test
from custom_registration.forms import EduRegistrationForm

urlpatterns = patterns('',
    url(r'^register/$', register_test, {'form_class': EduRegistrationForm}, name='registration.views.register'),
)

【问题讨论】:

    标签: python django inheritance django-registration


    【解决方案1】:

    据我所知,django-registration 使用的是基于函数的视图,因此您不能真正将它们子类化。我通常遵循的方法是“覆盖”原始视图(当然不修改 django-registration 应用程序)。像这样工作:

    1. 创建另一个应用程序(您可以将其命名为 custom_registration 或任何您想要的名称)
    2. 这个应用程序需要包含另一个urls.py,在你的情况下另一个views.py
    3. 将原始register 视图代码复制到您的新views.py 并对其进行修改,在您的urls.py 中添加一个模式以指向该视图(使用与django-registration 中相同的url 模式作为该视图)
    4. include 添加到您的新应用urls.py 的项目urls.py 之前您正在包含原始django-registration 应用。例如,这可能如下所示:
    urlpatterns = patterns('', 
        ...
        url(r'^accounts/', include('custom_registration.urls')),
        url(r'^accounts/', include('registration.backends.default.urls')),
        ... 
    )
    

    这很简单,因为/accounts/register 的第一个匹配 url 模式将指向您的新应用,因此它永远不会尝试从原始应用调用那个。

    【讨论】:

    • 我已经按照上面的编辑完成了大部分工作,但我会把它交给你。查看那个链接,你可以看到他是如何将一个函数包装在另一个函数上的,如果你通过了测试,你就可以找到真正的函数。我必须在我的测试函数中使用与register 中相同的参数,但除此之外效果很好。除此之外,无需复制他们的代码。查看我对代码的第二次编辑。
    • 是的,当然你也可以在你的视图中调用原始视图并返回它的响应。其实我一直都在做同样的事情。为了简单起见,虽然我在这里没有提到。
    • 有了最新最好的答案,这个答案现在已经过时了!现在可以对视图进行子类化。见django docsdjango-registration docs
    • 很高兴知道。会试试看。 :)
    猜你喜欢
    • 2011-06-23
    • 2013-05-05
    • 2011-02-05
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多