django - 如何为 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)
在这里,当您要编辑用户时,您需要输入要更改的字段及其新值。但问题在于用户名和密码是必填字段,即使您不想更改它们,也需要输入它们。我希望有一种方法可以定义(在我的代码中),在用户名和密码字段中自动填充当前用户和密码,如果用户想更改它们,请键入他的新值。
解决方案
首先,您可能希望在 DRF 的 API 视图和视图集中使用现有的 put 方法和 get_object,因为它们与您所拥有的非常相似。
至于你的问题,后端已经有了你需要的一切,所以你需要做的是:
- 发送获取请求以获取用户对象
- 在表单上显示值并允许用户编辑他想要的字段
- 使用 put 请求将新值(包括未编辑的旧值)发回后端
- 视图对它们进行序列化、验证和更新用户对象
这就是你真正需要的,正如你所看到的,后端已经拥有了所有需要的东西。
但是请记住,密码字段不应像其他字段一样进行编辑,因为它们需要在保存之前进行哈希处理。有一个单独的更改密码页面是一种常见的做法,您可以在其中以正确的方式处理密码更新。但是,如果您仍想以与其他方式相同的方式更新密码,则可以在序列化程序中执行以下操作:
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 实现,以允许必填字段的缺失值,因此您不必自己实现它
推荐阅读
- vue.js - 在 vuejs 中分步编辑的默认设置?
- ubuntu - ckan.plugins.core.PluginNotFoundException:example_theme
- laravel-8 - 如何在 Livewire 组件中存储带关系的模型
- php - Laravel 使用 HTTPS 显示白屏
- amazon-web-services - 幂等 AWS lambda 在冷启动时不执行代码
- c# - 带有查询参数的 MVC 属性路由不起作用
- php - 如何在 Laravel 8 中使用 WhereIn 查询
- laravel - SQLSTATE [23000]:违反完整性约束:1048 列“player_id”不能为空
- python - 如何对多元 LSTM 中的预测值进行逆变换?
- python - 基于元素数量的 Pyplot 限制 x 轴