我正在尝试使用Model.objects.update(** kwargs)使用网站前端提供的信息来更新数据库中的记录,但是在运行代码时出现以下错误:
“具有此ID的“记录”已存在。”
我曾希望使用“ update”方法而不是“ create”方法将意味着这无关紧要/应该已经存在具有相同ID的记录。
def find_patient(request):
my_form = ExampleForm()
if request.method == "POST":
my_form = ExampleForm(request.POST)
if my_form.is_valid():
UserInfo.objects.update(**my_form.cleaned_data)
else:
print(my_form.errors)
context = {
'form': my_form,
'data_input': DataInput.objects,
'sections': SECTION_CHOICES
}
return render(request, 'example.html', context)
产生的错误看起来像这样:
我是否误解了“更新”的用例,如果是这样,我将如何使用kwargs更新数据库中给定记录的所有字段?
答案 0 :(得分:2)
您的UserInfo.objects.update(**my_form.cleaned_data)
旨在更新数据库中的所有记录。由于您的表单包含主键(id
),因此它将旨在将所有记录的id
更新为给定值。但是,由于这些值应该是唯一的,因此这当然会引发错误。
您可以通过在更新之前进行过滤来防止这种情况发生,例如:
UserInfo.objects.filter(
pk=my_form.cleaned_data['id']
).update(**my_form.cleaned_data)
但是更新特定记录通常以不同的方式进行:您通常在URL中传递主键。因此urls.py
看起来像:
# app/urls.py
from django.urls import path
from app.views import find_patient
urlpatterns = [
# ...
path('updatepatient/<int:pk>/', views.find_patient),
# ...
]
然后在视图中,我们可以传递项目以更新为表单:
# app/views.py
from django.shortcuts import get_object_or_404, redirect
def find_patient(request, pk):
instance = get_object_or_404(UserInfo, pk=pk)
if request.method == "POST":
my_form = ExampleForm(request.POST, instance=instance)
if my_form.is_valid():
my_form.save()
return redirect('some-view-name')
else:
my_form = ExampleForm()
context = {
'form': my_form,
'data_input': DataInput.objects.all(),
'sections': SECTION_CHOICES
}
return render(request, 'example.html', context)
在POST请求成功的情况下,通常会重定向到页面。这是众所周知的Post/Redirect/Get pattern [wiki]。