Я не могу создать предварительно заполненную форму в python django

Я делаю простой проект, чтобы практиковать CRUD в Django, и я работаю над простым проектом "To Do", и это область моих кодов-

models.py

from django.db import models

# Create your models here.


class ToDoList(models.Model):

    title = models.CharField(max_length = 100, null = False , blank = False)
    description = models.CharField(max_length = 1000 , null = True , blank = True )
    date = models.DateField(null = True , blank = True )

    def __str__(self):
        return self.title 
    

forms.py

from django.forms import ModelForm 
from django import forms 
from .models import ToDoList

class ToDoForm(ModelForm):
    class Meta : 
        model = ToDoList
        fields = ['title','description','date']

        widgets = {
            'title': forms.TextInput(attrs={'class':'form-control'}),
            'description':forms.Textarea(attrs={'class':'form-control'}),
            'date': forms.DateInput(attrs={'type':'date'}),
        }

urls.py

from django.urls import path
from . import views 

urlpatterns = [
    path("",views.homepage,name = 'home_page'),
    path("add-new",views.add_todo,name = 'add_new'),
    path("delete-todo/<todo_id>",views.delete_todo,name = "delete_todo"),
    path("update_todo/<todo_id>",views.update_todo,name = "update_todo"),

    
    
]

views.py

from django.shortcuts import render , redirect 
from .forms import ToDoForm
from django.contrib import messages
from .models import ToDoList




# Codes for the homepage

def homepage(request):
    todos = ToDoList.objects.all()

    return render(request, 'index.html' , {'todos':todos})

# Codes for the add new todo

def add_todo(request):
    form = ToDoForm()

    if request.method == "POST":
        form = ToDoForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request,("Added new todo"))
            return redirect('home_page')
        else:
            print('not valid')
            return render(request,'addnew.html', {'form':form})
    
    return render(request,"addnew.html", {"form":form})

# Codes for the update todo (not working properly)

def update_todo(request, todo_id):
    todos = ToDoList.objects.get(pk=todo_id)
    
    if request.method == "POST":
        form = ToDoForm(request.POST, instance = todos)

        if form.is_valid():

            form.save()
            return redirect("home_page")
    
    else:

        form = ToDoForm(instance=todos)


    return render(request , "updatetodo.html", {"form":form, "todos":todos})

# code for deleting todo

def delete_todo(request, todo_id):
    todos = ToDoList.objects.get(pk=todo_id)
    
    if request.method == "POST":

        todos.delete()
        return redirect('home_page')
    else:

        return redirect('home_page')


Все функции работают нормально, кроме Update Todo. Я выполнил все шаги по созданию предварительно заполненной формы, но она не показывает мне ничего, только "Поля пусты", а также вот html-файл

updatetodo.html

{% extends "base.html" %}




{% block content %}

    {{todos.title}}


    <form action = "" method = "POST">
        {% csrf_token %}

        {{form.as_p}}

        <div class = "text-center">
           <button class = "btn btn-primary">Submit</button> 
        </div>
    
    </form>

{% endblock %}

пожалуйста, помогите мне найти решение для этого.

Я использовал google, django - documentation и следовал шагам этого случайного ytber, и все равно ничего не получилось. Может быть, я просто плохо понимаю английский, кто знает.

Добавьте id в модель ToDoList:

class ToDoList(models.Model):

title = models.CharField(max_length = 100, null = False , blank = False)
description = models.CharField(max_length = 1000 , null = True , blank = True )
date = models.DateField(null = True , blank = True )
id = models.UUIDField(default=uuid.uuid4,unique=True,primary_key=True,editable=False)

def __str__(self):
    return self.title

и для urls.py :

path("delete-todo/<str:pk>/",views.delete_todo,name = "delete_todo"),
path("update_todo/<str:pk>/",views.update_todo,name = "update_todo"),

и получить id по пк в коде представления, если вы скопируете эти урлы.

Попробуйте обновить index.html следующим образом:

{% extends "base.html" %}

{% block content %}

    {% for todo in todos %}
        <form action = "{% url 'delete_todo' todo.id %}" method = "POST">
            {% csrf_token %}
            <button type = "submit" class = "btn btn-danger">Delete</button>
        </form>
        <a href="{% url 'update_todo' todo.id %}" class = "btn btn-primary">Update</button>

        {{todo.title}}
        {{todo.description}}
        {{todo.date}}
    {% endfor %}

{% endblock  %}

Для перехода на страницу редактирования не нужно использовать кнопку формы, простая ссылка вызовет GET-запрос и отобразит предварительно заполненную форму. При использовании кнопки формы создавалось впечатление, что вы уже отправили форму с пустыми данными.

Вернуться на верх