gpt4 book ai didi

python - 如何在 Django 中使用模型形式编辑对象?

转载 作者:行者123 更新时间:2023-12-05 06:21:57 24 4
gpt4 key购买 nike

这可能是 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 值。谁能建议我正确的方法?

最佳答案

您的每个 View 都应该接受 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。这样您就可以为两个 View 使用相同的模板

关于python - 如何在 Django 中使用模型形式编辑对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59516835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com