我在django项目中有一个自定义的用户模型。我可以使用基于此模型的表单创建用户,但无法编辑和更改密码。我怎样才能做到这一点?
创建了如下所示的自定义用户模型。
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
class Role(models.TextChoices):
ADMIN = 'ADMIN', 'Admin'
DEVELOPER = 'DEVELOPER', 'Developer'
TESTER = 'TESTER', 'Tester'
base_role = Role.ADMIN
role = models.CharField(max_length=20, choices= Role.choices)
def save(self, *args,**kwargs):
if not self.pk:
self.role = self.base_role
return super().save(*args, **kwargs)
我尝试使用此表单编辑用户的配置文件并更改密码。
from django.contrib.auth.forms import UserCreationForm
from .models import User
from django import forms
class RegisterUserForm(UserCreationForm):
email = forms.EmailField()
first_name = forms.CharField(max_length=50)
last_name = forms.CharField(max_length=50)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email','role', 'password1', 'password2')
class EditUserForm(forms.ModelForm):
email = forms.EmailField()
first_name = forms.CharField(max_length=50)
last_name = forms.CharField(max_length=50)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')
对应的views.py文件
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from django.views.decorators.cache import never_cache
from .forms import RegisterUserForm, EditUserForm
from django.views import generic
from django.urls import reverse_lazy
from django.contrib.auth.views import PasswordChangeView
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.messages.views import SuccessMessageMixin
class EditProfileView(generic.UpdateView, SuccessMessageMixin):
form_class = EditUserForm
template_name = 'edit_profile.html'
success_url = reverse_lazy('home')
def get_object(self):
return self.request.user
def form_valid(self, form):
messages.success(self.request, 'Updated Successfully!')
return super().form_valid(form)
class PasswordsChangeView(PasswordChangeView):
form_class = PasswordChangeForm
template_name = 'change_password.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
messages.success(self.request, 'Password changed successfully')
return super().form_valid(form)
表单与模板配合得很好,但没有根据我提供的输入进行更新。