使用django-registration定制视图

Bri*_*n D 2 python django inheritance django-registration

我需要进行一个非常简单的修改 - 要求某些视图仅在用户未经过身份验证时显示 - 才能显示django-registration默认视图.例如,如果我已登录,则不希望用户再次访问/注册页面.

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

编辑

我认为这是正确的轨道:Django:重定向从登录页面登录用户

编辑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)
Run Code Online (Sandbox Code Playgroud)

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

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

顶级URLConf

(r'^accounts/', include('custom_registration.urls')),
(r'^accounts/', include('registration.urls')),
Run Code Online (Sandbox Code Playgroud)

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'),
)
Run Code Online (Sandbox Code Playgroud)

Tor*_*cht 5

据我所知,django-registration使用基于函数的视图,因此你无法真正将它们子类化.我通常遵循的方法是"覆盖"原始视图(当然不修改django-registration app).这样工作如下:

  1. 创建另一个应用程序(您可以将其称为custom_registration或任何您想要的)
  2. 这个应用程序需要包含另一个urls.py,在您的情况下另一个views.py
  3. 将原始register视图代码复制到新的views.py并修改它,向您添加一个模式以urls.py指向此视图(使用与此视图的django-registration相同的URL模式)
  4. 把一个include对您的项目urls.py新的应用程序urls.py 之前,您正在包括原始Django的注册程序.这可能看起来像这样:
urlpatterns = patterns('', 
    ...
    url(r'^accounts/', include('custom_registration.urls')),
    url(r'^accounts/', include('registration.backends.default.urls')),
    ... 
)
Run Code Online (Sandbox Code Playgroud)

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