在Django的同一视图中更新并创建一个条目

6tqwzwtp  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(174)

我是Django的新手,我正在开发一个用于计划的CRUD应用程序。“添加”和“删除”操作运行良好。对于更新操作,一旦用户确认,我想将此计划的状态更改为“已删除”,并在数据库中为修改后的计划添加一个新行。
以下是到目前为止我创建一个新计划的方法,该计划运行良好:

def init(request):
    if request.method == 'POST':
        form = InitiativeForm(request.POST)
        if form.is_valid() :
            try :
                form.save()
                return redirect('/show')
            except :
                pass
    else:
        form = InitiativeForm()
    return render(request, 'index.html', {'form': form})

以下是我删除方案的方法。我不想删除方案,只想将状态切换为“已删除”。这也很有效:

def destroy(request, id):  
    initiative = Initiative.objects.get(id=id)
    initiative.status_init = Status.objects.get(status = 'DELETED') 
    initiative.save(force_update=True)  
    return redirect('/show')

但是对于更新操作,我想保留以前的记录并将状态切换为“已删除”(就像我删除一个方案一样),我想将新记录保存为新行(就像我创建一个新方案一样)。下面是我的当前代码:

def update(request, id):  

    initiative = Initiative.objects.get(id=id)
    form = InitiativeForm(instance = initiative)

    if form.is_valid():
        initiative.status_init = Status.objects.get(status = 'DELETED') 
        initiative.save(force_update = True)  
        form.save()
        return redirect('/show')
    return render(request, 'index.html', {'form': form})

但它只是添加一个新的行与修改的倡议。它不切换当前记录的状态为'删除'。任何想法为什么?感谢您的帮助,真的很感激。

pexxcrt2

pexxcrt21#

我不是100%确定,但是forminitiative可能指向同一个东西。
您可以尝试这样的操作(未测试),将状态更新为DELETED,并创建一个新记录。这可能不会按预期工作,但它可能会使您走上正确的方向。

def update(request, id):  
    initiative = Initiative.objects.get(id=id)
    if request.method == "POST":
        form = InitiativeForm(request.POST)

        if form.is_valid():
            initiative.status_init = Status.objects.get(status = 'DELETED') 
            initiative.save(update_fields=['status',])  
            # form.save()  # I believe this is now equivalent to initiative - play with your debugger to confirm
            # create a new object
            Initiative.objects.create(id=id, **request.POST)
            return redirect('/show')
    return render(request, 'index.html', {'form': form})
jqjz2hbq

jqjz2hbq2#

根据AMG的输入,我尝试了以下代码,但它仍然添加了新的计划,但没有将初始计划的状态切换为“已删除”

def update(request, id):  
    initiative = Initiative.objects.get(id=id)
    form = InitiativeForm(instance = initiative)
    if form.is_valid():
        initiative.status_init = Status.objects.get(status = 'DELETED') 
        initiative.save(update_fields=['status'])  
        Initiative.objects.create(id=id, **request.POST)
        return redirect('/show')
    return render(request, 'edit.html', {'form': form})

相关问题