这可能是该答案的重复。目前,我正在使用用于创建对象的相同模型形式来更新对象。
我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})
我的html形式editpost
如下:
<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值。谁能建议我正确的方法?
您的每个视图都应接受GET和POST方法,当该方法为GET时,将实例化表单,而不request.POST
会将任何数据传递给它,并且仅呈现表单。
def newpost(request):
if request.method == 'GET':
form = PostForm()
else: # POST
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('newpost')
return render(request, 'console/newpost.html', {'form':form})
def editpost(request, pk):
obj = Post.objects.get(id=pk)
if request.method == 'GET':
form = PostForm(instance=obj)
else: # POST
form = PostForm(request.POST, instance=obj)
if form.is_valid():
form.save()
return redirect('editpost')
return render(request, 'console/editpost.html', {'form':form})
<form method="POST">
如果您未在表单上设置“ action”属性,它将把数据提交到浏览器当前所在的URL。这样,您可以对两个视图使用相同的模板
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句