使用django-registration定制视图

2 投票
1 回答
3505 浏览
提问于 2025-04-17 00:50

我需要做一个非常简单的修改——要求某些页面只有在用户未登录时才能显示——这是关于django-registration默认页面的。比如说,如果我已经登录了,我不希望用户还能访问/register这个页面。

所以,我想我需要从django-registration中继承register这个视图。但我不太确定接下来该怎么做。这方向对吗?我应该在这里检查用户的登录状态吗?欢迎提供建议和意见!

编辑

我觉得这个方向是对的: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)

我必须使用相同的函数参数,但其他的只需要加上测试,如果通过了,就继续执行主函数。

别忘了把这个也放到你的URL配置里(同样,这里也包括了一些关于我自定义表单的内容):

顶级URL配置

(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 个回答

5

我记得django-registration是用函数来处理视图的,所以你不能直接去继承它们。我通常的做法是“覆盖”原来的视图(当然不去修改django-registration这个应用)。具体步骤如下:

  1. 创建一个新的应用(你可以叫它custom_registration或者其他你喜欢的名字)
  2. 这个应用需要包含一个新的 urls.py 文件,还有一个新的 views.py 文件
  3. 把原来的 register 视图的代码复制到你新的 views.py 文件里,并进行修改,然后在你的 urls.py 文件中添加一个路径,指向这个视图(这个路径要和django-registration中的保持一致)
  4. 在你的项目的 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 时,系统会首先找到你新应用的路径,而不会去调用原来应用的视图。

撰写回答