如何在django-registration中使用不同的视图?

4

我一直在尝试使用django-registration的RegistrationFormUniqueEmail视图,并按照这个django-registration问题的解决方案进行操作。我已经将我的urls.py设置为:

from django.conf.urls import patterns, include, url

from registration.forms import RegistrationFormUniqueEmail

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    (r'^users/', include('registration.backends.default.urls')),
    url(r'^users/register/$', 'registration.backends.default.views.RegistrationView',
        {'form_class': RegistrationFormUniqueEmail,
         'backend': 'registration.backends.default.DefaultBackend'},       
        name='registration_register'),
)

然而,我仍然可以使用同一电子邮件地址创建多个帐户。问题出在哪里?django-registration不应该使用我指定的视图吗?我目前正在使用django-registration 0.9b1版本。
2个回答

17
您正在使用的 Django 注册版本已重写以使用类视图。这意味着您需要在 urls.py 中采用不同的方法。
首先,您需要子类化 RegistrationView,并设置自定义表单类。
from registration.backends.default.views import RegistrationView
from registration.forms import RegistrationFormUniqueEmail

class RegistrationViewUniqueEmail(RegistrationView):
    form_class = RegistrationFormUniqueEmail

然后,在你的urls中使用你自己的RegistrationViewUniqueEmail子类。和其他基于类的视图一样,你必须调用as_view()方法。

url(r'^user/register/$', RegistrationViewUniqueEmail.as_view(),
                    name='registration_register'),

确保您自定义的注册注册视图在包含默认注册URL之前,否则它将不会被使用。


@Alasdair,针对url(r'^user/register/$', RegistrationViewUniqueEmail.as_view(), name='registration_register') 的Pylint报错:ID:E1120 函数调用中没有为参数'cls'传递值。这是什么意思? - Olga
3
@Olga,Pylint有时会出现误报。你可以在urls.py模块顶部添加#pylint:disable = E1120来禁用该错误检查。 - Alasdair

3

django-registration-redux1.2版本允许使用以下urls.py模式来实现唯一电子邮件选项:

url(r'^accounts/register/$', RegistrationView.as_view(form_class=RegistrationFormUniqueEmail), name='registration_register'),
url(r'^accounts/', include('registration.backends.default.urls')),

如果您需要执行更多操作,例如特定的URL选项,您可以在应用程序的views.py中子类化RegistrationViewforms.py中的RegistrationForm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接