2

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

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

编辑

我认为这是正确的做法: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'),
)
4

1 回答 1

5

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

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

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

于 2011-08-31T06:18:11.497 回答