首页 > 解决方案 > 如何为 put 方法提供初始数据,Django(我想创建编辑个人资料页面)

问题描述

我有这个 Put 函数:

def get_object(self, pk):
    try:
        return User.objects.get(pk=pk)
    except Exception as e:
        raise Http404

def put(self, request, pk, format=None):
            user = self.get_object(pk)
            serializer = UserSerializer(user, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data)
            return Response(serializer.errors,satus=status.HTTP_400_BAD_REQUEST)

在这里,当您要编辑用户时,您需要输入要更改的字段及其新值。但问题在于用户名和密码是必填字段,即使您不想更改它们,也需要输入它们。我希望有一种方法可以定义(在我的代码中),在用户名和密码字段中自动填充当前用户和密码,如果用户想更改它们,请键入他的新值。

标签: djangodjango-rest-framework

解决方案


首先,您可能希望在 DRF 的 API 视图和视图集中使用现有的 put 方法和 get_object,因为它们与您所拥有的非常相似。

至于你的问题,后端已经有了你需要的一切,所以你需要做的是:

  1. 发送获取请求以获取用户对象
  2. 在表单上显示值并允许用户编辑他想要的字段
  3. 使用 put 请求将新值(包括未编辑的旧值)发回后端
  4. 视图对它们进行序列化、验证和更新用户对象

这就是你真正需要的,正如你所看到的,后端已经拥有了所有需要的东西。

但是请记住,密码字段不应像其他字段一样进行编辑,因为它们需要在保存之前进行哈希处理。有一个单独的更改密码页面是一种常见的做法,您可以在其中以正确的方式处理密码更新。但是,如果您仍想以与其他方式相同的方式更新密码,则可以在序列化程序中执行以下操作:

def update(self, instance, validated_data):
    password = validated_data.pop('password', None)
    instance = super().update(instance, validated_data)
    if password:
        instance.set_password(password)
    return instance

部分更新

如果您希望仅将更改的字段发送到后端,请使用 PATCH HTTP 方法,该方法用于REST 术语中的部分更新。它已经由 DRF 实现,以允许必填字段的缺失值,因此您不必自己实现它


推荐阅读