我正在尝试在我的页面上添加一个表单,该表单将更新我的数据库中的某个字段。
模板如下所示:
{% 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/