Django-registration,强制唯一电子邮件

16

我能在django-registration中强制要求用户创建唯一的电子邮件地址吗?


在“POST”视图中,如果User.objects.filter(username=username).exists()返回True,则return HttpResponseRedirect(reverse('accounts:unique'))语句会将用户重定向到一个提示该电子邮件不是唯一的消息。注意,这里的'accounts:unique'是特定的URL名称,需要根据实际情况进行替换。 - Josh
8个回答

17

对于使用基于类的视图的django_registration的较新版本,您可以执行以下操作:

from registration.forms import RegistrationFormUniqueEmail
from registration.backends.default.views import RegistrationView

urlpatterns = patterns('',
    url(r'^register/$',
        RegistrationView.as_view(form_class=RegistrationFormUniqueEmail),
        name='registration_register'),
)

registration.backends.default.views 会给你一个NotImplementedError。在运行时,激活代码将失败。你需要的是 registration.backends.hmac.views 或 registration.backends.model_activation.views。 - Jing

13
从 rych 的回答中,我测试了以下代码可以成功运行——它只使用 urls.py,您不需要编写另一个自定义表单。
from registration.forms import RegistrationFormUniqueEmail

url(r'^accounts/register/$', 'registration.views.register',
    {'form_class': RegistrationFormUniqueEmail,
     'backend': 'registration.backends.default.DefaultBackend'},       
     name='registration_register'),

我有这个设置,但它不起作用。我该如何排除故障?我在site-packages/registration/forms.py的第一行(即第88行)class RegistrationFormUniqueEmail(RegistrationForm):之后设置了断点以确保它运行,并且它确实运行了,因为控制台返回了:RuntimeWarning) /Users/merty/.virtualenvs/ssc/lib/python2.7/site-packages/registration/forms.py(92)RegistrationFormUniqueEmail() 91 ---> 92 def clean_email(self): 93 """ipdb> 然后我在验证条件的各个部分放置了断点,但它似乎没有捕获到那部分是否正在运行?! - KindOfGuy

5

我需要访问django-registration文件吗?我已经在注册定义中更改了form_class,但没有任何反应。我无法访问已安装的django-registration文件,只能访问我的应用程序文件夹中的django-registration文件实例。 - DJPython
我不确定你的设置,但我曾经将最新的django-registration版本下载到我的项目目录中,这样我就可以在需要时更改文件(并且在需要时更新应用程序)。在我的情况下,上述方法非常有效... - miku

4

正如miku所指出的那样,您应该简单地使用RegistrationFormUniqueEmail。

如果按照文档和错误报告回复(截至2011年中期)的实现方式,您可能会遇到异常,例如:

TypeError at /accounts/register/
register() takes at least 2 non-keyword arguments (1 given)

为了正确指定此后端,您的urlconf应该如下所示:

(r'^accounts/register/', 'registration.views.register' {'form_class':RegistrationFormUniqueEmail, 'backend':'registration.backends.default.DefaultBackend' }),
(r'^accounts/', include('registration.backends.default.urls')),

[ 请原谅我额外的回答,因为这应该作为对miku正确答案的评论; 我没有评论的特权,但这个提示可能会节省至少几个人每15分钟,所以希望值得这个被迫的不礼貌 ]


4
forms.py

from registration.forms import RegistrationFormUniqueEmail

class RegistroPerfilForm(RegistrationFormUniqueEmail):
    first_name= forms.CharField(required=True)
    last_name= forms.CharField(required=True)
    kind__of_user= forms.CharField(widget=forms.RadioSelect(choices=TIPO))

在 forms.py 文件中执行导入操作更加整洁,加一分。 - almost a beginner

2

您可以直接从用户模型中创建注册表单。如果在该模型中定义了电子邮件地址为唯一的,则提交表单时,将输出重复地址错误。

详情请参见此处

正如Dominic所指出的那样,您将无法使用内置的用户配置文件来实现此功能。您需要按此处描述的方式扩展它,使其包含唯一的电子邮件地址。


1
当模型是内置的时,这并没有太大帮助... http://docs.djangoproject.com/en/dev/topics/auth/#fields - Dominic Rodger
但是我希望当用户尝试使用已被占用的昵称时,会引发反应 - 他会收到AJAX错误,指出该昵称已被使用 - 我希望对电子邮件也做同样的处理。 - DJPython

1

对于django-registration-redux 1.4中的唯一电子邮件地址。

在url.py中添加以下内容

from registration.forms import RegistrationFormUniqueEmail
from registration.backends.default.views import RegistrationView urlpatterns = [ url(r'^accounts/register/$',RegistrationView.as_view(form_class=RegistrationFormUniqueEmail), name='registration_register'),
url(r'^accounts/', include('registration.backends.default.urls'))
]

0

从django-registration 3.1.2开始,我能够以一种几乎与https://dev59.com/eXI95IYBdhLWcg3w1Bro#19383392相同的方式解决这个问题:

from django_registration.forms import RegistrationFormUniqueEmail
from django_registration.backends.activation.views import RegistrationView

urlpatterns = [
    ...
    path('accounts/register/',
        RegistrationView.as_view(
            form_class=RegistrationFormUniqueEmail
        ),
        name='django_registration_register',
    ),
    path('accounts/', include('django_registration.backends.activation.urls')),
    ...
]

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