2011-08-31 134 views
2

自定义的视图我需要做一个非常简单的修改 - 要求某些观点仅显示当用户没有通过验证 - 到Django的注册默认视图。例如,如果我登录,我不希望用户能够再次访问/注册页面。Django的注册

所以,我觉得这里的想法是,我想从子类Django的注册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) 

我不得不使用相同的函数的参数,但在其他方面只包括测试,如果我们通过它,继续的主要功能。

不要忘了把这个在你的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'), 
) 

回答

5

据我记得,Django注册使用基于函数的视图,所以你不能真正的子类。我通常遵循该方法是“覆盖”原次(不修改当然django的登记应用程序)。这是这样的:

  1. 创建另一个应用程序(你可以叫它custom_registration或任何你想要的)
  2. 这个程序需要包含另一个urls.py和你的情况另一个views.py
  3. 复制原register视图代码到新views.py并对其进行修改,添加一个模式到您urls.py指向这个视图(使用相同的URL模式在Django的注册此观点)
  4. 把一个include到项目的urls.py您新的应用程序urls.py之前你都包括原始Django的注册程序。这可能看起来像这样的例子:
urlpatterns = patterns('', 
    ... 
    url(r'^accounts/', include('custom_registration.urls')), 
    url(r'^accounts/', include('registration.backends.default.urls')), 
    ... 
) 

这只是工作,因为对于/accounts/register第一个匹配的URL模式将指向新的应用程序,所以它永远不会尝试调用从一个原始应用程序

+0

我按照上面的编辑完成了大部分工作,但我会把它给你。看看这个链接,你可以看到他是如何围绕另一个函数包装一个函数的,如果你通过了这个测试,你就可以慢慢地转向真正的函数。我必须在我的测试函数中使用与'register'中相同的参数,但否则它会很好。除此之外,不需要复制它们的代码。查看我的第二个编辑代码。 –

+0

是的,当然,您也可以在视图中调用原始视图并返回其响应。其实我一直都这样做。尽管我没有在这里提到,但保持简单。 –

+1

随着最新和最伟大的,这个答案现在已经过时了!视图可以现在分类。 请参阅[django文档](https://docs.djangoproject.com/en/1.5/topics/class-based-views/intro/)和[django注册文档](https://django-registration.readthedocs .org/en/latest/views.html) –