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