Django:仅更新UpdateView中已更改的字段

2023-11-24

我正在使用 UpdateView 来更新一系列字段。但是,我只想将已修改的字段保存到数据库中。如果在更新过程中未为字段提供值,我希望将以前的值用作默认值。如果为字段提供了新值,则只应更新该字段。我该如何实现这一目标?

#views.py
class AccountUpdate(UpdateView):
""" Updates an account; unchanged fields will not be updated."""
context_object_name = 'account'
form_class = UpdateForm
template_name = 'accounts/update_account.html'
success_url = '/accounts/home'

def get_object(self, queryset=None):
    return self.request.user

def form_valid(self, form):
    clean = form.cleaned_data
    #encrypt plain password
    form.instance.password = hash_password(clean['password'])
    context = {}
    self.object = context.update(clean, force_update=False)
    return super(AccountUpdate, self).form_valid(form)

#templates
{% extends 'base.html' %}
<title>{% block title %}Update Account{% endblock %}</title>
{% block content %}
{{ account.non_field_errors }}
<div class="errors" style="list-style-type: none;">
    {% if account.first_name.errors %}{{ account.first_name.errors }}{% endif %}
    {% if account.last_name.errors %}{{ account.last_name.errors }}{% endif %}
    {% if account.email.errors %}{{ account.email.errors }}{% endif %}
    {% if account.password.errors %}{{ account.password.errors }}{% endif %}
    {% if account.username.errors %}{{ account.username.errors }}{% endif %}
</div>
<form action="" name="edit" method="post">
    {% csrf_token %}
    <ul>
        <li>Fullname</li>
       <li> {{ form.first_name }}{{ form.last_name }}</li>
        <li>Email</li>
        <li>{{ form.email }}</li>
        <li>Password</li>
        <li>{{ form.password }}</li>
        <li>Username</li>
        <li>{{ form.username }}</li>
    </ul>
    <ul>
        <li><input type="submit" value="update account"></li>
    </ul>
</form>
<ul>
    <li class="nav"><a href="/accounts/">cancel changes</a></li>
</ul>
{% endblock %}

所有字段也按要求声明models.py。目前,只有当我为每个字段提供一个值时,该表单才有效。


我在更新过程中使用自定义哈希来加密密码。当我访问编辑页面并点击更新按钮时,当前加密形式的旧密码会被重新加密,从而丢失旧密码

我会通过不包括来处理这个问题password本身的形式。相反,我会添加一个新字段(类似于new_password) 以允许输入新密码。然后,在你的is_valid方法,如果有内容,则将密码设置为该字段的哈希值。

您还应该使用敏感值过滤防止用户密码出现在通过电子邮件发送的错误报告中的工具。

class UpdateForm(forms.ModelForm):
    class Meta:
        model = user
        fields = ('first_name', 'last_name', 'email', 'username')
    new_password = forms.CharField(required=False, widget=forms.widgets.PasswordInput)

然后在你看来:

@sensitive_variables('new_password')
@sensitive_post_parameters('new_password')
def form_valid(self, form):
    clean = form.cleaned_data
    new_password = clean.get('new_password')
    if new_password:
        #encrypt plain password
        form.instance.password = hash_password(new_password)
    return super(AccountUpdate, self).form_valid(form)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:仅更新UpdateView中已更改的字段 的相关文章

随机推荐

  • 如何压缩没有完整路径的文件夹

    首先 我不知道哪个是正确的 stackExchange 站点来发布此问题 如果问题是针对其他堆栈站点 请删除我的问题 现在来说说这个问题 这种情况是我有一个文件位于 home user public html folder one fold
  • Plotly 地图未在 R 中渲染

    我已经成功安装了 R 的plotly 库 首先 我按照他们的 R 入门指南 直接从 RStudio 版本 0 99 489 中的几个图中复制代码 散点图 箱线图等示例效果很好 气泡图和分区统计图的示例未正确绘制 地图根本不渲染 运行代码后仅
  • 在 PHP 中评估类似 MongoDB 的 JSON 查询

    考虑此 JSON 对象中表达的以下 相当复杂 查询 name Kindle Fire sale true price gt 199 lt 264 price vat bogus just to show a price vat a pric
  • 如何定期调用asyncTasks

    我有两个 AsyncTasks 执行网络操作 我想定期给他们打电话 比如一分钟后 我怎么做 我不认为我可以在 UI 线程上做到这一点 我需要创建一个新线程吗 是否可以在没有 AlarmManager Service 的情况下实现此功能 基本
  • Android 上启动完成后如何在 BroadcastReceiver 上启动 Activity

    我使用下面的代码让我的应用程序可以在启动完成 10 秒后自动启动 public class BootActivity extends BroadcastReceiver static final String ACTION android
  • 将空值排序在所有其他值之后,特殊情况除外

    我有一个带有可选排序字段的 PostgreSQL 项目表 CREATE TABLE tasks id integer PRIMARY KEY DEFAULT nextval f seq f id integer REFERENCES fix
  • Android 7 意图附加功能缺失

    有谁知道与 Android 6 0 Lollipop 相比 Android 7 0 Nougat 处理 Intent extras 的方式是否有任何变化 长话短说 我的应用程序在 4 1 16 到 6 0 23 的所有版本上都能按预期运行
  • Angular 6:HttpErrorResponse SyntaxError:JSON 中出现意外的 token

    我正在发布一个请求 我应该会收到一个 成功 字符串作为响应 我收到一个 HttpResponseError 其中包含下图中发布的以下信息 采购订单服务 postPurchaseOrderCustom purchaseOrderCustom
  • 在 PHP 中创建基于边缘检测的图像

    我很好奇 是否可以用 PHP 实现 1 发送图像文件到服务器 2 处理图像 检测边缘并根据边缘创建简单的笔画 3 将文件保存在服务器上 将其发送到用户的浏览器 其他 这是一些 示例 文件 P 如您所见 它不是使用任何启用边缘检测的程序制作的
  • GAE python 线程不并行执行

    我正在尝试在 GAE 上使用 Python 创建一个简单的 Web 应用程序 应用程序需要根据收到的请求生成一些线程 为此 我使用 python 的线程库 我生成所有线程 然后等待它们 t1 start t2 start t3 start
  • sqlalchemy 在多个列中是唯一的

    假设我有一个代表位置的类 地点 属于 客户 位置由 unicode 10 字符代码标识 位置代码 在特定客户的位置中应该是唯一的 The two below fields in combination should be unique cu
  • Odoo/OpenERP:从树视图中隐藏创建按钮

    我这里有一个情况 我正在使用 OpenERP 7 我试图从我的产品的树视图中隐藏 创建 按钮 这可以通过使用来完成
  • 隐藏的 div 高度(改变我的建议)

    好吧 我要在这里回答某人关于为什么他们的脚本不起作用的问题 他们将内容加载到隐藏的 div 中 然后获取高度 以便为包裹的 div 制作动画 但我总是尝试测试我提供的代码 所以我做了这个演示向他们证明这一点 那么 嗯 我现在是进入了暮光区还
  • 关于java字符串文字池和字符串连接的混淆

    全部 当我编写下面的代码时遇到问题 String hello Hello String str5 Hel lo String str8 Hel String str9 lo String str10 str8 str9 System out
  • 在C#中执行包含GO语句的SQL批处理

    我正在尝试构建一个程序 它可以批量执行sql语句并进行错误处理 因此我没有使用SMO 问题是GO不是 SQL 的一部分 当使用 NET 执行语句时 它最终会出现错误 SMO 会处理它 但不会给出执行是否失败的任何指示 string stat
  • 如果包含的单元格为空,则使用 jQuery 隐藏表格列

    我有一个以下类型的表 table width 500 border 1 cellspacing 0 cellpadding 0 thead tr th span 1 span th th span 2 span th th span 3 s
  • Select() 查询中使用的 Lambda 表达式

    我正在尝试构建一个 lambda 表达式 其中包含两个赋值 如下所示 然后我可以将其传递给 Queryable Select 方法 我试图将字符串变量传递到方法中 然后使用该变量构建 lambda 表达式 以便我可以在 LINQ Selec
  • 如何更新 XAMPP 的 PHP 版本 [重复]

    这个问题在这里已经有答案了 可能的重复 在 Windows 版 XAMPP 中升级 PHP 我目前使用 XAMPP 版本 1 8 1 其中 PHP 版本 5 4 3 我从一天前发布的 PHP 站点版本 5 4 11 找到了最新版本的 PHP
  • 在 Eclipse (Galileo) 中安装 Maven 插件 (m2eclipse) 时出现问题

    我已经安装了 Eclipse Galileo 适用于 Java EE 开发人员 现在我正在尝试安装 m2eclipse Maven 插件 我按照以下描述的基本步骤进行操作http m2eclipse sonatype org install
  • Django:仅更新UpdateView中已更改的字段

    我正在使用 UpdateView 来更新一系列字段 但是 我只想将已修改的字段保存到数据库中 如果在更新过程中未为字段提供值 我希望将以前的值用作默认值 如果为字段提供了新值 则只应更新该字段 我该如何实现这一目标 views py cla