一般如果擴展了django user內置表,在admin后台創建新用戶的時候密碼將會變成明文,故而導致登錄不成功。所以我們在admin.py可以通過form自定義進行對password進行操作,可以雙重驗證並且可以set_password將明文的密碼修改成Hash加密過的密碼。
from django.contrib import admin from django.contrib.auth.models import AbstractUser # Register your models here. from user_profile.models import User,LoginLog # admin.site.register(User) admin.site.register(LoginLog) from django.contrib.auth import ( authenticate, get_user_model, password_validation, ) from django.contrib.auth.forms import UsernameField from django import forms from django.contrib.auth.forms import ReadOnlyPasswordHashField class UserCreationForm(forms.ModelForm): """ A form that creates a user, with no privileges, from the given username and password. """ error_messages = { 'password_mismatch': "The two password fields didn't match.", } password1 = forms.CharField( label="Password", strip=False, widget=forms.PasswordInput, ) password2 = forms.CharField( label="Password confirmation", widget=forms.PasswordInput, strip=False, help_text="Enter the same password as before, for verification.", ) class Meta: model = User fields = ("username",) field_classes = {'username': UsernameField} def __init__(self, *args, **kwargs): super(UserCreationForm, self).__init__(*args, **kwargs) if self._meta.model.USERNAME_FIELD in self.fields: self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': ''}) def clean_password2(self): password1 = self.cleaned_data.get("password1") password2 = self.cleaned_data.get("password2") if password1 and password2 and password1 != password2: raise forms.ValidationError( self.error_messages['password_mismatch'], code='password_mismatch', ) self.instance.username = self.cleaned_data.get('username') password_validation.validate_password(self.cleaned_data.get('password2'), self.instance) return password2 def save(self, commit=True): user = super(UserCreationForm, self).save(commit=False) user.set_password(self.cleaned_data["password1"]) if commit: user.save() return user from django.contrib.auth.admin import UserAdmin as auth_UserAdmin class UserAdmin(auth_UserAdmin): add_form = UserCreationForm