2015-01-21 4 views
1

저는 장고 1.7을 사용하고 있으며 제공된 장고 인증 사용자 대신 전자 메일을 사용하여 사용자를 인증하려고합니다.전자 메일로 장고 사용자 인증

이 내 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 

나는 계정을 등록하려고 할 때마다, 'NoneType' object has no attribute '_insert'에서 오류가 발생합니다. forms.py 호출 user.save 및 views.py 호출 form.save. user.save를 작성하는 방법을 모르지만 두 오류를 모두 수정한다고 생각합니다.

아무도 도와 줄 수 있습니까? forms.py 수입

from django.contrib.auth.models import User 

에서

답변

2

보기는

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

대신 그

동일한의 참고 MyUser를 가져오고 참고 MyUser 클래스

objects = MyUserManage() 

변화에 추가해야합니다

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

settings.py 설정해야합니다

AUTH_USER_MODEL = '<apppath>.MyUser' 
+1

MyUserManage 밤은 링크를 참고 MyUser에 참고 MyUser 클래스에이 추가 :'객체 = MyUserManager()'나는'객체 = MyUserManager를 추가하는 것을 잊었다 – rizotas

+0

()' , 이제는 작동합니다. 정말 고맙습니다! – erip