Сохранение входа пользователя в систему после смены пароля (Django) пользовательская модель пользователя

#python #django

#python #django

Вопрос:

У меня есть настроенная модель Django. Моя проблема заключается в том, что всякий раз, когда я обновляю какую-либо информацию профиля пользователя, она выходит из системы. Я знаю, что Django вышел из системы пользователя после смены пароля, и я должен использовать функцию update_session_auth_hash(). Однако в моем случае это не сработало, и я не хочу использовать Django changePasswordForm, потому что я хочу, чтобы пользователь мог изменять всю свою информацию в одной форме. Любая помощь будет оценена.

Это моя пользовательская модель пользователя:

 class MyUser(AbstractBaseUser):
   firstName = models.CharField(max_length=100, validators =[firstnameCheck] )
   lastName = models.CharField(max_length=100, validators =[lastnameCheck] )
   #nationalID = models.IntegerField(unique=True)
   nationalID = models.CharField(max_length=10, validators=[RegexValidator(r'^[0-9]{10}

Это мое мнение

 def update_admin(request,id):
context = {}
if request.method == "POST":
    pi = MyUser.objects.get(pk=id)
    fm = UserRegisterationForm(request.POST,instance=pi)
    if fm.is_valid():
        request.user.set_password(fm.cleaned_data['password1'])
        fm.save()
        update_session_auth_hash(request, request.user)
        messages.add_message(request, messages.INFO, 'The profile updated successfully.')
    context['form'] = fm

else:
    pi = MyUser.objects.get(pk=id)
    fm = UserRegisterationForm(instance=pi)
    context['form'] = fm


return render(request,'project/update_admin.html', context)
 

Ответ №1:

Вы могли бы сделать что-то вроде этого.

Шаблон:

 <form method="POST" class="contact-form" action="{% url 'change-password' %}"> ##make sure the action links to the `changepassword` view
{% csrf_token %}
    <input type="password" name="password" required id="password" pattern="^[a-zA-Z0-9]{6,}$">
</div>
<button type="submit">Submit</button>

</form>
 

Views.py:

 def changepassword(request):

   user = request.user

   if 'password' in request.POST:
       user.set_password(request.POST['password'])
       

return render(request, 'project/changepassword.html')
 

Это позволит вашему пользователю войти в систему после смены пароля, но вам нужно будет добавить к этому обработку проверки и обработку ошибок, чтобы сделать это жизнеспособным решением.

)], unique=True)
GENDER_CHOICES = [('male', 'Male'), ('female', 'Female')]
gender = models.CharField(choices=GENDER_CHOICES, max_length=10)
dateofbirth = models.DateField(auto_now=False, auto_now_add=False)
email = models.EmailField(max_length=100, unique=True)
password = models.CharField(max_length=100)
password_confirm = models.CharField(max_length=100, default='')
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)

USERNAME_FIELD = 'email' #enable authentication by using email instead of default 'username'
REQUIRED_FIELDS = ['firstName', 'lastName', 'nationalID','gender','dateofbirth','password','password_confirm']

objects = MyUserManager()

def __str__(self):
return self.email

def has_perm(self, perm, obj=None):
return True

def has_module_perms(self,app_label):
return True
Это мое мнение


Ответ №1:

Вы могли бы сделать что-то вроде этого.

Шаблон:


Views.py:


Это позволит вашему пользователю войти в систему после смены пароля, но вам нужно будет добавить к этому обработку проверки и обработку ошибок, чтобы сделать это жизнеспособным решением.