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

Я делаю простой проект по практике CRUD в Django и работаю над простым проектом «To Do», и это мои коды.

модели.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 
    

формы.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"),
]

view.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')

все функции работают нормально, кроме «Обновить список». Я выполнил все шаги, чтобы создать предварительно заполненную форму, и она ничего мне не показывает, просто «Поля пусты, а еще это 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 %}

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>
        <form action = "{% url 'update_todo' todo.id %}" method = "POST">
            {% csrf_token %}
            <button type = "submit" class = "btn btn-primary">Update</button>
        </form>

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

{% endblock  %}

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

Я использовал документацию Google, Django и следовал инструкциям этого случайного ютбера, но все равно это не сработало. Может быть, я просто плохо понимаю английский, кто знает.

Вы уверены, что объект, который вы редактируете, действительно содержит данные, поскольку все поля могут быть пустыми.

Benbb96 07.06.2024 17:23

@Benbb96 Benbb96 да, я уверен.

Shadhul Haneef 07.06.2024 17:39

Мне любопытно, как вы переходите todo_id к def update_todo(request, todo_id): представлению. Можете ли вы отредактировать свой вопрос, чтобы показать файл index.html. Вы заявляете, что уверены, что в экземпляре есть данные. Вы видите это в админ-панели? Вы уверены, что идентификатор в панели администратора совпадает с идентификатором в URL-адресе updatetodo?

raphael 07.06.2024 19:31

@raphael Я обновил его. Посмотрите на index.html в конце.

Shadhul Haneef 08.06.2024 11:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Добавьте идентификатор в свою модель 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"),

и получите идентификатор по pk в коде просмотра, если вы скопируете эти URL-адреса.

Я получаю сообщение об ошибке

Shadhul Haneef 08.06.2024 11:31

в чем твоя ошибка?

AhmadRezaMozafari 08.06.2024 12:43

ValueError: неправильно сформированная шестнадцатеричная строка UUID –

Shadhul Haneef 08.06.2024 16:30
Ответ принят как подходящий

Попробуйте обновить 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 и отобразит предварительно заполненную форму. С кнопкой «Форма» это выглядело так, как будто вы уже отправили форму с пустыми данными.

МНЕ ПОТРЕБОЛО ДВА ДНЯ НА РЕШЕНИЕ, И Я НЕ БЫЛ ДОСТАТОЧНО УМН, ЧТОБЫ НАЙТИ ЭТО ОДНО, БОЛЬШОЕ СПАСИБО

Shadhul Haneef 08.06.2024 22:29

Ха-ха, не будь слишком строг к себе, такое случается со всеми, и этому нужно учиться.

Benbb96 09.06.2024 00:26

Другие вопросы по теме