Py学习  »  Django

如何在django中使用model form编辑对象?

Mowli • 4 年前 • 1020 次点击  

这可能是 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})

我的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})

这段代码给了我想要的东西,但我知道这不是一个好的做法。我的问题是,这是一个正确的方式还是我落后了。 我知道我的行为 编辑帖子 html不应该是 {% url 'newpost' %} ,但如果我使用 {% url 'editpost' %} 我不知道如何在url标记中传递pk值。有人能告诉我正确的方法吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/52076
 
1020 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Iain Shelvington
Reply   •   1 楼
Iain Shelvington    4 年前

每个视图都应该接受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。这样,可以对两个视图使用相同的模板