【发布时间】:2020-04-18 08:57:46
【问题描述】:
这可能与this 答案重复。目前,我正在使用与创建对象相同的模型表单来更新对象。
我的views.py 看起来像:(从答案):
def newpost(request):
form = PostForm(request.POST)
if request.method == "POST":
if form.is_valid():
obj = form.save(commit=False)
obj.save()
return redirect('newpost')
return render(request, 'console/newpost.html', {'form':form})
def editpost(request, pk):
obj = Post.objects.get(id=pk)
form = PostForm(instance=obj)
if request.method == "POST":
if form.is_valid():
obj = form.save(commit=False)
obj.save()
return redirect('editpost')
return render(request, 'console/editpost.html', {'form':form})
我在editpost 中的 html 表单看起来像:
<form method="POST" action="{% url 'newpost' %}">
{% csrf_token %}
{{form.as_p}}
<button type="submit"> Submit</button>
</form>
我的urls.py 看起来像:
path('console/post/', c_views.newpost, name='newpost'),
path('console/post/<int:pk>/', c_views.editpost, name='editpost'),
上面的代码工作得很好,但是创建了一个新实例,对象的数据取自pk。
我添加了这样的obj.delete() 代码:
def editpost(request, pk):
obj = Post.objects.get(id=pk)
form = PostForm(instance=obj)
obj.delete()
if request.method == "POST":
if form.is_valid():
obj = form.save(commit=False)
obj.save()
return redirect('editpost')
return render(request, 'console/editpost.html', {'form':form})
这段代码给了我想要的东西,但我知道这不是一个好习惯。我的问题是,这是正确的方法还是我落后于某个地方。
我知道我的editpost html 中的操作不应该是{% url 'newpost' %},但是如果我使用{% url 'editpost' %},我不知道如何在 url 标记内传递 pk 值。谁能建议我正确的方法?
【问题讨论】:
-
为什么编辑视图和删除视图都同名?
-
由于我在更新对象时,使用查询的值再次创建了一个新实例。所以我删除了以前的对象,以便只有新对象留在数据库中!!