使用自定义用户模型

时间:2018-05-24 22:12:54

标签: django

自定义用户模型(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函数 - 只要它们有效!

非常感谢!

2 个答案:

答案 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。它是用户注册和管理的开源解决方案,提供大量自定义功能,适用于自定义用户模型。

https://github.com/pennersr/django-allauth

相关问题