自定义用户模型(models.py):
class Users(AbstractBaseUser):
user_id = models.AutoField(primary_key=True)
user_email = models.EmailField(max_length=100, unique=True)
password = models.CharField(max_length=100)
registration_date = models.DateField(auto_now_add=True)
last_login = models.DateField(auto_now_add=True)
is_administrator = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
email_verified = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'user_email'
自定义用户管理器(models.py)
class UserManager(BaseUserManager):
def create_user(self, user_email, password):
user = self.model(
email=self.normalize_email(user_email)
)
user.set_password(password)
user.save(using=self._db)
return user
注册表格(forms.py):
class RegistrationForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
password_confirm = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = get_user_model()
fields = ('user_email',)
def clean_password(self):
password1 = self.cleaned_data.get("password")
password2 = self.cleaned_data.get("password_confirm")
if password1 and password2 and password1 != password2:
raise forms.ValidationError( self.error_messages['password_mismatch'],
code='password_mismatch' )
return password2
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.registration_date = datetime.date.today()
user.last_login = datetime.date.today()
user.set_password("password")
if commit:
user.save()
return user
注册视图(views.py)
def register(request):
if request.method == "POST":
form = RegistrationForm(request.POST)
if form.is_valid:
form.save()
else:
form = RegistrationForm()
return render(request, 'web/page.html', {'form' : form})
这是我在网上的第一个问题(我是搜索工具的狂热用户),但我已经苦苦挣扎了几天,我觉得它应该不会那么困难。
对于我的问题,它更像是一个两部分的查询。
1)我想要一个自定义用户模型,但想要使用Django提供的功能。但摆脱用户名字段并添加其他几个字段似乎要求我“自定义”其他所有内容。包括自定义用户管理器和自定义表单 - 不理想!上面的注册表格有效但我希望有一些更简单的东西:
class RegistrationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = get_user_model()
fields = ('user_email', 'password1', 'password2')
但我似乎在挣扎,运行它会给我一个错误:
无法创建用户,因为数据未验证。
理想情况下,我想要一些简单的东西,没有错误。如果Django增加了新的安全功能,我希望它能减少更少的错误并希望更多的未来证明。
2)为什么以下登录代码不起作用?
登录表单(forms.py):
class LoginForm(forms.Form):
user_email = forms.EmailField(max_length=100)
password = forms.CharField(max_length=100)
登录视图(views.py):
def login_user(request):
if request.method == "POST":
user_email = request.POST.get('email')
password = request.POST.get('password')
UserModel = get_user_model()
user = UserModel.objects.get(user_email=user_email)
if user.check_password(password):
login(request, user)
return render(request, 'login.html')
我很确定问题在于第二个if语句。输入正确的密码时,它不会给出True值。尝试了print(user.user_id)后,会为输入的电子邮件和密码指定正确的ID。使用了一些明文密码,它可以工作,但我更喜欢set_password和check_password函数 - 只要它们有效!
非常感谢!
答案 0 :(得分:0)
我解决了这个问题。两个天真的错误!
对于第二点,Login View(views.py)代码运行良好,问题是注册表单(forms.py)。特别是:
user.set_password("password")
实际上是将“密码”保存为密码。改为:
user.set_password(self.cleaned_data["password_confirm"])
让它发挥作用。
不重要(对于第一点),因为继承UserCreationForm的4行注册表一直工作并将替换第一个。原来问题是我没有输入有效密码(最少8个字母)。为什么在以下期间验证views.py中的数据:
if form.is_valid:
然后告诉我以后我不知道。我希望Django会更详细地讨论这个问题!
答案 1 :(得分:0)
我建议您查看Django all-auth。它是用户注册和管理的开源解决方案,提供大量自定义功能,适用于自定义用户模型。