使用电子邮件验证 Django 用户

Authenticating a Django user with email

我正在使用 Django 1.7 并尝试使用电子邮件而不是提供的 Django 身份验证用户对用户进行身份验证。

这是我的models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=MyUserManager.normalize_email(email),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password):
        user = self.create_user(email,
            password=password,
        )
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    """
    Custom user class.
    """
    email = models.EmailField('email address', unique=True, db_index=True)
    joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'

    def __unicode__(self):
        return self.email

这是我 views.py

的片段
def auth_view(request):
   username = request.POST.get('username', '')
   password = request.POST.get('password', '')
   user = auth.authenticate(username=username, password=password)

   if user is not None:
     auth.login(request, user)
     return HttpResponseRedirect('/')
   else:
     return HttpResponseRedirect('/invalid/')

def register_user(request):
   if request.method == 'POST':
      form = MyRegistrationForm(request.POST)
      if form.is_valid():
         print "Form is valid"
         form.save()
         return HttpResponseRedirect('/register_success/')
   args = {}
   args.update(csrf(request))
   args['form'] = MyRegistrationForm()
   return render_to_response('register.html', args, context_instance=RequestContext(request))

最后,我的 forms.py

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


class MyRegistrationForm(forms.ModelForm):
    """
    Form for registering a new account.
    """
    email = forms.EmailField(widget=forms.EmailInput,label="Email")
    password1 = forms.CharField(widget=forms.PasswordInput,
                                label="Password")
    password2 = forms.CharField(widget=forms.PasswordInput,
                                label="Password (again)")

    class Meta:
        model = User
        fields = ['email', 'password1', 'password2']

    def clean(self):
        """
        Verifies that the values entered into the password fields match

        NOTE: Errors here will appear in ``non_field_errors()`` because it applies to more than one field.
        """
        cleaned_data = super(MyRegistrationForm, self).clean()
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
                raise forms.ValidationError("Passwords don't match. Please enter both fields again.")
        return self.cleaned_data

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

每当我尝试注册帐户时,forms.py 调用 user.save 和 views.py 调用 form.save 都会收到错误 'NoneType' object has no attribute '_insert'。我真的不知道如何写 user.save,但我想这会解决这两个错误。

谁能帮帮我?

查看 forms.py 导入

from django.contrib.auth.models import User

必须导入 MyUser 而不是那个

class Meta:
    model = User
    fields = ['email', 'password1', 'password2']

并添加到 MyUser class

objects = MyUserManage()

改为

class Meta:
    model = MyUser
    fields = ['email', 'password1', 'password2']

settings.py必须设置:

AUTH_USER_MODEL = '<apppath>.MyUser'