gpt4 book ai didi

python - 使用电子邮件验证 Django 用户

转载 作者:行者123 更新时间:2023-12-01 04:52:51 25 4
gpt4 key购买 nike

我正在使用 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

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

有人可以帮助我吗?

最佳答案

查看 forms.py 导入

from django.contrib.auth.models import User

必须导入 MyUser 而不是它

同样

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

并添加到 MyUser 类

objects = MyUserManage()

更改为

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

settings.py必须设置:

AUTH_USER_MODEL = '<apppath>.MyUser'

关于python - 使用电子邮件验证 Django 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28071830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com