使用django-registration定制视图

时间:2011-08-31 06:00:50

标签: python django inheritance django-registration

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

所以,我认为这里的想法是我想从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)

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

不要忘记把它放在你的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'),
)

1 个答案:

答案 0 :(得分:5)

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

  1. 创建另一个应用程序(您可以将其称为custom_registration或任何您想要的)
  2. 此应用需要包含另一个urls.py,在您的情况下需要包含另一个views.py
  3. 将原始register视图代码复制到新views.py并修改它,向urls.py添加一个模式以指向此视图(使用与django中相同的网址格式 - 注册此视图)
  4. 将<{1}}添加到新应用include 的项目urls.py,包括原始django-registration应用。例如,这可能是这样的:
  5. urls.py

    这很简单,因为urlpatterns = patterns('', ... url(r'^accounts/', include('custom_registration.urls')), url(r'^accounts/', include('registration.backends.default.urls')), ... ) 的第一个匹配网址格式将指向您的新应用,因此它永远不会尝试从原始应用中调用该模式。