ModelForm создает новую запись, несмотря на предоставление экземпляра - PullRequest
0 голосов
/ 18 апреля 2020

Я создаю список задач, в котором я могу создать элемент задачи и предоставить кнопку для каждого элемента, чтобы обновить его. Я использую 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>

1 Ответ

0 голосов
/ 18 апреля 2020

здесь вы снова сохраняете форму, которая создает новую запись (в функции обновления). вместо этого попробуйте получить объект из базы данных как

form_object = <model_name>.objects.get(id = id)
form_object.<parameter_to_be_updated> = <the value you want>
form_object.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...