如何更新现有记录而不是在 Django 中创建新记录?
How to update an existing record instead of creating a new one in django?
所以我在views.py中有以下函数:
def recipe_edit(request, pk):
recipe = get_object_or_404(Recipe, pk=pk)
if request.method == "POST":
initial = {'title': recipe.title, 'description': recipe.description}
form = RecipeForm(request.POST, initial=initial)
if form.is_valid():
current_user = request.user
data = form.cleaned_data
recipe_data=Recipe.objects.create(user=current_user, title=data['title'], description=data['description'])
recipe_data.save( force_insert=False, force_update=False, using=None)
return HttpResponseRedirect('recipe_detail', pk=recipe.pk)
else:
initial = {'title': recipe.title, 'description': recipe.description}
form = RecipeForm(initial=initial)
return render(request, 'recipe_edit.html', {'form': form, 'recipe':recipe})
但是当我提交表单时,它并没有编辑旧记录,而是创建了一条新记录。关于如何更新旧记录而不是创建新记录有什么建议吗?
加上台词
recipe_data=Recipe.objects.create(user=current_user, title=data['title'], description=data['description'])
recipe_data.save( force_insert=False, force_update=False, using=None)
您正在创建并保存一个新实例。
由于您在 recipe
有旧食谱,要更新它,您只需将这些行替换为如下内容:
recipe.title = data['title']
recipe.description = data['description']
recipe.save()
你应该很明显,你在is_valid块中专门调用了create
,所以你自然会创建一个记录。但是,除了始终创建之外,通过这样做,您还绕过了模型为您提供的所有帮助。
您应该传递 instance
,而不是传递 initial
;然后在 is_valid 块中你应该调用 form.save
.
def recipe_edit(request, pk):
recipe = get_object_or_404(Recipe, pk=pk)
if request.method == "POST":
form = RecipeForm(request.POST, instance=recipe)
if form.is_valid():
recipe = form.save(commit=False)
recipe.user = request.user
recipe.save()
return redirect('recipe_detail', pk=recipe.pk)
else:
form = RecipeForm(instance=recipe)
return render(request, 'recipe_edit.html', {'form': form, 'recipe':recipe})
所以我在views.py中有以下函数:
def recipe_edit(request, pk):
recipe = get_object_or_404(Recipe, pk=pk)
if request.method == "POST":
initial = {'title': recipe.title, 'description': recipe.description}
form = RecipeForm(request.POST, initial=initial)
if form.is_valid():
current_user = request.user
data = form.cleaned_data
recipe_data=Recipe.objects.create(user=current_user, title=data['title'], description=data['description'])
recipe_data.save( force_insert=False, force_update=False, using=None)
return HttpResponseRedirect('recipe_detail', pk=recipe.pk)
else:
initial = {'title': recipe.title, 'description': recipe.description}
form = RecipeForm(initial=initial)
return render(request, 'recipe_edit.html', {'form': form, 'recipe':recipe})
但是当我提交表单时,它并没有编辑旧记录,而是创建了一条新记录。关于如何更新旧记录而不是创建新记录有什么建议吗?
加上台词
recipe_data=Recipe.objects.create(user=current_user, title=data['title'], description=data['description'])
recipe_data.save( force_insert=False, force_update=False, using=None)
您正在创建并保存一个新实例。
由于您在 recipe
有旧食谱,要更新它,您只需将这些行替换为如下内容:
recipe.title = data['title']
recipe.description = data['description']
recipe.save()
你应该很明显,你在is_valid块中专门调用了create
,所以你自然会创建一个记录。但是,除了始终创建之外,通过这样做,您还绕过了模型为您提供的所有帮助。
您应该传递 instance
,而不是传递 initial
;然后在 is_valid 块中你应该调用 form.save
.
def recipe_edit(request, pk):
recipe = get_object_or_404(Recipe, pk=pk)
if request.method == "POST":
form = RecipeForm(request.POST, instance=recipe)
if form.is_valid():
recipe = form.save(commit=False)
recipe.user = request.user
recipe.save()
return redirect('recipe_detail', pk=recipe.pk)
else:
form = RecipeForm(instance=recipe)
return render(request, 'recipe_edit.html', {'form': form, 'recipe':recipe})