python - django中通过form更新DB数据

标签 python django django-forms django-views

我正在尝试在我的页面上添加一个表单,该表单将更新我的数据库中的某个字段。

模板如下所示:

{% for row in mydb %}
  <form action="/myview/{{myslug}}/" method="post" novalidate>
    {% csrf_token %}
    {% include 'main/includes/bs4_form.html' with form=form3 %}
      {{row.firstfield}}
      {{row.secondfield}}
      <button name="button3" type="submit" class="btn btn-danger style="background-color: red;">CANCEL</button></td>
  </form>
{% endfor %}

for语句的作用是将我的表中的每一行数据显示在一行中。每行附近都有一个提交按钮。单击此按钮时,字段 secondfield 将更新为值 New Value,如您在我的表单中看到的那样。

这是涉及 View 的部分:

def myview(request, tvticker):
  row = mydb.objects

  if request.method == 'POST':

  ...
      if 'button3' in request.POST:
        form3 = form = UpdateForm(request.POST)
        if form3.is_valid():
          profile = form.save(commit=False)
          profile.save()
          messages.success(request, f"Success")
  ...

   render(request, "main/mytemplate.html", 
          context={'row': row,})

这是表格:

class UpdateForm(forms.ModelForm):

    SomeField = forms.CharField()
    class Meta:
        model = MyModel
        fields = ("SomeField",)

    def save(self, commit=True):
        send = super(UpdateForm, self).save(commit=False)
        send.secondfield = 'New Value'
        if commit:
            send.save()
        return send

我的实际代码不起作用,似乎发送了 POST 请求,但 secondfield 值未更新。例如,如果我单击 template.html 中第二条记录的提交按钮,则该记录的 secondfield 值应从 oldvalue 更改> 到新值。目前,该值尚未更新。

欢迎任何建议,提前致谢!

最佳答案

我看不到您如何将要更新的记录的 id(即主键)传递到 View 。是在帖子数据中吗?

您应该记住ModelForm构造函数有一个属性 instance,该属性应用于在调用 ModelForm 本身的 save() 方法时传递要更新的现有对象。

您没有在 UpdateForm 构造函数中使用 instance 属性,因此这可能是您的记录未按预期更新的问题。

假设您要更新的记录的 id 位于名称为 pk 的 POST 数据中,您可以编写如下内容:

if 'button3' in request.POST:
    instance = MyModel.objects.get(pk=request.POST['pk'])
    form3 = form = UpdateForm(request.POST, instance=instance)
    if form3.is_valid():
        profile = form.save(commit=False)
        profile.save()

这是您可以用来让记录 id 进入 POST 数据的 HTML:

{% for row in mydb %}
    <form action="/myview/{{myslug}}/" method="post" novalidate>
    {% csrf_token %}
    <input type="hidden" name="pk" value="{{ row.pk }}">
    {% include 'main/includes/bs4_form.html' with form=form3 %}
    {{row.firstfield}}
    {{row.secondfield}}
    <button name="button3" type="submit" class="btn btn-danger style="background-color: red;">CANCEL</button></td>
    </form>
{% endfor %}

关于python - django中通过form更新DB数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341693/

相关文章:

django - 如何在 Forms.py 中进行 Django 链式选择?

Python::三元运算符::无法使用多个语句

sql - 及时卡住django模型对象,像快照一样

python - send_message() 缺少 1 个必需的位置参数 : 'message'

django - Django 模型是否知道它是从哪个数据库加载的以及如何访问此信息?

django - 使用Django表单显示和编辑?

django - 根据 View 传递的对象 ID 过滤表单上的外键选择选项

python - 获取导致异常的异常描述和堆栈跟踪,全部作为字符串

python - Tweepy + App Engine 示例 OAuth 帮助

php - [Linux, Ubuntu] : Executing a Python script with different users results in different behaviours