python - 尽管提供了实例,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>
解决方案
在这里,您再次保存创建新记录的表单(在更新功能中)。而是尝试从数据库中获取对象
form_object = <model_name>.objects.get(id = id)
form_object.<parameter_to_be_updated> = <the value you want>
form_object.save()
推荐阅读
- swift - Swift - 将代表连接到自定义 Xib 单元
- javascript - CryptoJS:key.clamp 不是一个函数
- selenium - Firefox 52.9.0esr (Tor Browser 7.5.6) 哪个版本的 marionette_driver
- struct - C#7 之后结构上的 ReferenceEquals
- arrays - 朱莉娅朗:错误?初始化可空数组
- c# - Differentiate between child classes from a parent class object?
- python - ValueError:“照片”属性没有与之关联的文件
- typescript - 无处不在的错误:“无法调用类型缺少调用签名的表达式。类型'RaygunStatic'没有兼容的调用签名。”
- sql-server - 从 MS Access 到 MSSQL 的导入数据编码错误
- docker - Kubernetes (gke) 获取 pod 网络接口的名称