Skip to main content
 首页 » 编程设计

python之通过django中的表单更新数据库数据

2024年09月03日33oomusou

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

这是模板的样子:

{% 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 语句是将我表中的每一行数据显示在一行中。在每一行附近,都有一个 submit 按钮。单击此按钮时,字段 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 。是在post数据里吗?

你应该记住 ModelForm constructor 有一个属性 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 %}