Я делаю простой проект по практике 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 Benbb96 да, я уверен.
Мне любопытно, как вы переходите todo_id к def update_todo(request, todo_id): представлению. Можете ли вы отредактировать свой вопрос, чтобы показать файл index.html. Вы заявляете, что уверены, что в экземпляре есть данные. Вы видите это в админ-панели? Вы уверены, что идентификатор в панели администратора совпадает с идентификатором в URL-адресе updatetodo?
@raphael Я обновил его. Посмотрите на index.html в конце.






Добавьте идентификатор в свою модель 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-адреса.
Я получаю сообщение об ошибке
в чем твоя ошибка?
ValueError: неправильно сформированная шестнадцатеричная строка UUID –
Попробуйте обновить 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 и отобразит предварительно заполненную форму. С кнопкой «Форма» это выглядело так, как будто вы уже отправили форму с пустыми данными.
МНЕ ПОТРЕБОЛО ДВА ДНЯ НА РЕШЕНИЕ, И Я НЕ БЫЛ ДОСТАТОЧНО УМН, ЧТОБЫ НАЙТИ ЭТО ОДНО, БОЛЬШОЕ СПАСИБО
Ха-ха, не будь слишком строг к себе, такое случается со всеми, и этому нужно учиться.
Вы уверены, что объект, который вы редактируете, действительно содержит данные, поскольку все поля могут быть пустыми.