Я создаю список задач, в котором я могу создать элемент задачи и предоставить кнопку для каждого элемента, чтобы обновить его. Я использую ModelForm для сохранения моих данных в БД. Кнопка обновления позволяет мне «обновить. html» с экземпляром выбранной задачи. Но когда я обновляю информацию о задаче и нажимаю «Отправить», она создает новую задачу с обновленной информацией и не обновляет ту же задачу. Пожалуйста, помогите мне, я застрял.
views.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)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name = 'list'),
path('update/<str:pk>/', views.update, name = 'update')
]
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>