首页 > 解决方案 > 尽管提供了实例,ModelForm 仍在创建新记录

问题描述

我正在创建一个 ToDo 列表,我可以在其中创建一个 ToDo 项目并针对每个项目提供一个按钮来更新它。我正在使用 ModelForm 将我的数据保存到数据库。更新按钮将我带到带有所选任务实例的“update.html”。但是当我更新任务信息并单击“提交”时,它会使用更新的信息创建一个新任务,并且不会更新相同的任务。请帮帮我,我卡住了。

视图.py

from django.shortcuts import render, redirect
from .models import Task
from .forms import *

def index(request):
    tasks = Task.objects.all()
    form = TaskForm()

    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')
    else:
        context = {'tasks':tasks,'form':form}
        return render(request,'TaskList/list.html',context)

def update(request, pk):

    task = Task.objects.get(id = pk)

    if request.method == 'POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('/')   
    else:
        form = TaskForm(instance = task)
        context = {'task':task, 'form':form}
        return render(request,'TaskList/update.html', context)

网址.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name = 'list'),
    path('update/<str:pk>/', views.update, name = 'update')
]

更新.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method = 'POST' action = ''>
        {% csrf_token %}
        {{form}}
        <input type = 'submit' name = 'Update'>
    </form>
</body>
</html>

列表.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ToDoList</title>
</head>
<body>
    <form method = 'POST' action = ''>
        {% csrf_token %}
        {{form.title}}
        <input type = 'submit' name = 'Create Task'>
    </form>
    {% for task in tasks %}
        <div>
            <a href = "{% url 'update' task.id %}">Update</a>
            <p>{{task.title}}</p>
        </div>
    {% endfor %}
</body>
</html>

标签: pythonhtmldjango

解决方案


在这里,您再次保存创建新记录的表单(在更新功能中)。而是尝试从数据库中获取对象

form_object = <model_name>.objects.get(id = id)
form_object.<parameter_to_be_updated> = <the value you want>
form_object.save()

推荐阅读