Python Django:如何在不更新用户密码字段的情况下更新用户模型

Python Django:如何在不更新用户密码字段的情况下更新用户模型,python,django,django-forms,Python,Django,Django Forms,我正在尝试创建一个用户更新端点,该端点只更新用户的选定字段。我目前的实现是使用ModelForm的save方法保存模型,但我也尝试了基本模型保存方法 我的请求正文不包含密码字段,我的UserForm中也没有密码字段,但是我无法维护当前会话或在执行更新后注销并与当前用户一起重新登录。我几乎肯定这是因为Django在更新过程中的某个地方更改了我的密码 其他相关信息:我使用的是Django(不是Django Rest框架)。我有一个自定义的用户模型。我知道我可以通过使用带有DRF的序列化程序来解决这个

我正在尝试创建一个用户更新端点,该端点只更新用户的选定字段。我目前的实现是使用ModelForm的save方法保存模型,但我也尝试了基本模型保存方法

我的请求正文不包含密码字段,我的UserForm中也没有密码字段,但是我无法维护当前会话或在执行更新后注销并与当前用户一起重新登录。我几乎肯定这是因为Django在更新过程中的某个地方更改了我的密码

其他相关信息:我使用的是Django(不是Django Rest框架)。我有一个自定义的用户模型。我知道我可以通过使用带有DRF的序列化程序来解决这个问题,但单独使用它来解决这个问题似乎有点不对劲

我的端点如下所示:

def saveAccountData (request):
    resp = {}
    if request.method == 'POST':
        form = UserForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()

            resp['result'] = 'User updated'
            return HttpResponse(
                json.dumps(resp),
                status=200
            )
        else:
            return HttpResponse(
                json.dumps(form.errors),
                status=422,
            )
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['email', 'name', 'is_active', 'is_admin']

    def save(self, commit=True):
        user = super(UserForm, self).save(commit=False)
        user.name = self.cleaned_data['name']

        if commit:
            user.save()
        return user
我的表单如下所示:

def saveAccountData (request):
    resp = {}
    if request.method == 'POST':
        form = UserForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()

            resp['result'] = 'User updated'
            return HttpResponse(
                json.dumps(resp),
                status=200
            )
        else:
            return HttpResponse(
                json.dumps(form.errors),
                status=422,
            )
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['email', 'name', 'is_active', 'is_admin']

    def save(self, commit=True):
        user = super(UserForm, self).save(commit=False)
        user.name = self.cleaned_data['name']

        if commit:
            user.save()
        return user
用户模型:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.conf import settings
import logging

class UserManager(BaseUserManager):

    def create_user(self, email, name, password=None):
        # executes if email is zero (false) or an empty container (equivalent to None)
        logger = logging.getLogger(__name__)
        logger.warning('Create user: ' + password)
        if not email:
            raise ValueError("Please provide an email address")

        if not password:
            raise ValueError("Please enter a password")

        if not name:
            raise ValueError("Please enter your name")

        # normalize email address (convert to lower case so all email addresses are standardized)
        user = self.model(
            email = self.normalize_email(email),
            name=name,
        )
        # the set_password method encrypts the password
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, password, name):
        user = self.create_user(
            email, 
            password=password, 
            name=name)

        user.is_superuser = True
        user.is_admin = True
        user.save(using=self._db)

        return user

class User(AbstractBaseUser, PermissionsMixin):

    email = models.EmailField(max_length=50, unique=True)
    password = models.CharField(max_length=100)
    name = models.CharField(max_length=100)
    phone = models.CharField(max_length=20)
    city = models.CharField(max_length=50)
    state = models.CharField(max_length=20)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()
    # we must specify a username field
    USERNAME_FIELD = 'email'
    # required fields are used for create_superuser
    REQUIRED_FIELDS = ['name']

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.name

    def __str__(self):
        # django uses this method when it needs to convert an object to a string
        return self.email

我创建了一个UpdateAccountForm(forms.ModelForm), 并覆盖save(),如下所示:

```


```

您确定要更改您的密码吗?您的表单中有一个is_active字段,这是否会在保存后使您的用户保持活动状态?在用户模型更新后更改密码不是django的常规做法。自定义表单保存方法的要点是什么
name
是表单和模型上的一个字段,它将与所有其他字段一起自动保存。自定义保存方法的要点是允许部分更新,但我尚未完全构建它。该配置旨在测试行为并防止密码更新。我会调查这件事的,谢谢。真的不需要自定义保存方法。在任何情况下,只有您在表单中指定的字段才会更新。感谢@devdob处于活动状态,并且is_admin都被设置为false,我不知怎么错过了。是的,丹尼尔,你是对的,我不需要。谢谢