使用django-registration定制视图
我需要做一个非常简单的修改——要求某些页面只有在用户未登录时才能显示——这是关于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这个应用)。具体步骤如下:
- 创建一个新的应用(你可以叫它custom_registration或者其他你喜欢的名字)
- 这个应用需要包含一个新的
urls.py
文件,还有一个新的views.py
文件 - 把原来的
register
视图的代码复制到你新的views.py
文件里,并进行修改,然后在你的urls.py
文件中添加一个路径,指向这个视图(这个路径要和django-registration中的保持一致) - 在你的项目的
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
时,系统会首先找到你新应用的路径,而不会去调用原来应用的视图。