首页 > 解决方案 > 这是从数据库中打开对象以相同形式进行编辑,然后使用 django 保存同一对象的更新值的正确方法吗?

问题描述

这是我的代码:

要创建新的问题对象,请使用表单

def raise_issue_view(request, *args, **kwargs):
    
    form = RaiseIssueForm(request.POST or None)
    if form.is_valid():
        form.save()

        obj = RaiseIssueModel.objects.latest('id')
        return redirect("/raise_issue/" + str(obj.id))
    
    context = {
        "form" : form
    }

    return render(request,"raise_issue.html", context)

要编辑之前创建的问题,请通过链接 127...8000/edit_issue/<issue_id>

def edit_issue_view(request, id):
    obj = RaiseIssueModel.objects.get(id=id)

    form = RaiseIssueForm(instance=obj)
    new_form = RaiseIssueForm(request.POST, instance=obj)
    

    if new_form.is_valid():
        
        new_form.save()
        
        return redirect("/raise_issue/" + str(obj.id))
    
    context = {
        "form" : form
    }

    return render(request,"raise_issue.html", context)

在这里,在编辑问题视图中,首先我将数据库数据加载到“表单”中,然后创建一个新表单 (new_form) 来保存更新的数据。这可以吗,还是有更好的方法来做到这一点?谢谢,

标签: pythondjangodjango-forms

解决方案


您可以使用GETPOST请求来执行不同的功能。GET 用于从 DB 和 POST 获取对象以进行更改并将其保存到 DB。例如:

from django.shortcuts import get_object_or_404

def edit_issue_view(request, id):
    obj = get_object_or_404(RaiseIssueModel, pk=id)
    new_form = RaiseIssueForm(request.POST or None, instance=obj)
    if request.method == 'POST':
        if new_form.is_valid(): 
            new_form.save() 
            return redirect("/raise_issue/" + str(obj.id))
    
    context = {
        "form" : new_form
    }

    return render(request,"raise_issue.html", context)

raise_issue_view还添加了有关重定向到编辑视图的方法的微小更改。如您所见,form.save()返回您刚刚创建/更新的对象。您可以将其用于重定向:

if form.is_valid():
    obj = form.save()
    return redirect("/raise_issue/" + str(obj.id))

最后,对于重定向,最好使用命名的 url。例如,如果您的网址如下所示:

path('raise_issue/<int:pk>/', name='raise_issue')

然后您可以使用以下代码进行重定向:

return redirect('raise_issue', pk=obj.pk)

有关详细信息,请参阅文档


推荐阅读