django默认注册模块使用唯一的用户名但相同的电子邮件

时间:2015-05-15 18:20:31

标签: python django email django-authentication django-registration

我正在使用django默认注册模块来注册用户。 该模块正在做什么,它使用不同的用户名注册用户但是同样的电子邮件。 如果它正在这样做,我怎么能发送忘记密码电子邮件?

我在views.py中写了这个,所以同样的电子邮件没有注册,但这也无效。用户仍然使用相同的电子邮件注册。

def register_user(request):
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            try:
                user_present = User.objects.get(username=form.username)
            except:
                user_present = None
            if user_present:
                messages.error(request, 'Username already taken')
                args = {}
                args.update(csrf(request))
                args['form'] = MyRegistrationForm()
                return render_to_response('register.html',args)
            else:
                try:
                    user_present = User.objects.get(email=form.email)
                except:
                    user_present = None
                if user_present:
                    messages.error(request, 'Your email is already registered.')
                    args = {}
                    args.update(csrf(request))
                    args['form'] = MyRegistrationForm()
                    return render_to_response('register.html',args)
                else:
                    form.save()
                    return HttpResponseRedirect('/accounts/register_success')
        else:
            args = {}
            args.update(csrf(request))
            args['form'] = MyRegistrationForm()
            messages.error(request, 'There were errors in the form. Please fill again.')
            return render_to_response('register.html',args)
    args = {}
    args.update(csrf(request))
    args['form'] = MyRegistrationForm()
    return render_to_response('register.html',args)

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class MyRegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        if commit:
            user.save()
        return user

有没有办法像这样添加unique = True? :

email = forms.EmailField(required=True,unique=True)

1 个答案:

答案 0 :(得分:0)

据我了解,您使用的usernameemail值不正确。您应该从以下表单中获取它们:form.cleaned_data['username']form.cleaned_data['email']。我还建议将此验证放入Form本身。阅读clean_fieldname方法here。还有一件事:您不需要对username进行任何唯一性测试,因为它默认定义为unique=True,因此只需测试电子邮件:

class MyRegistrationForm(UserCreationForm):
    # your code here
    def clean_email(self):
        email = self.cleaned_data.get('email')
        if email:
            if User.objects.filter(email=email).exists():
                raise forms.ValidationError('Your email is not unique.')
        return email

如果没有这些独特性测试,你现在看起来会更简单。