[英]ValueError at /addtodo/: Not able to add new items in todo-list
我已经多次尝试运行这个待办事项应用程序,首先我编写了自己的代码,但它给出了很多错误,所以我遵循了多个教程,并阅读了文档。
首先,我尝试仅使用html表单提交数据(即不制作 forms.py 文件),但它没有返回任何内容,只是一直重定向到我的待办事项页面; 虽然我能够通过管理站点添加新项目,但我的表单没有返回任何内容。 其次,我重做了整个项目,删除了“due_date”字段(因为它会导致问题)并在forms.py中创建 ModelForm
我发现主要问题在于我的views.py文件中的某个地方,以及我的AddTodo函数。 当我只为 html 表单编写视图时,我按照此处、此处和此处的说明对我的函数进行了多次更改。
在我的 models.py 文件中:
from django.db import models
# Create your models here.
class TodoItem(models.Model):
task = models.CharField(max_length = 100)
category = models.CharField(max_length = 30)
description = models.TextField()
def __str__(self):
return self.task
在我的 forms.py 文件中
from django.forms import ModelForm
from .models import TodoItem
class TodoItemForm(ModelForm):
class Meta(object):
model = TodoItem
fields = ["task","category","description"]
在我的项目 urls.py 文件中
from django.contrib import admin
from django.urls import path
from todo_app import views
urlpatterns = [
path('admin/', admin.site.urls),
path('todo/',views.TodoView,name = 'todo'),
path('addtodo/',views.AddTodo,name = 'addtodo'),
path('deletetodo/<int:todo_id>/',views.DeleteTodo,name = 'deletetodo'),
]
在我的 index.html 模板中
<div class="card-body">
<p>Please fill the form to enter a new task:</p>
<form action='/addtodo/' method="POST">
{% csrf_token %}
{{ form }}
<div class = "form-group">
<label for="task">Task/To-do item</label>
<input class = "form-control" type="text" id="task" placeholder="Add a new task">
</div>
<div class = "form-group">
<label for="category">Category</label>
<input class = "form-control" type="text" id="category" placeholder="Give your task a label">
</div>
<div class = "form-group">
<label for="description">Description</label>
<textarea class = "form-control" id="description" rows="3" placeholder="Details of your task"></textarea>
</div>
<input class = 'btn btn-warning btn-lg' type="submit" value="Add">
</form>
</div>
<div class="col-lg-8 d-none d-lg-block" id = 'task-list'>
<h1>This is my ToDo List!</h1>
<ul>
{% for todo_items in all_items %}
<li class = 'p-1 pl-3 mb-2' style="background: rgba(255, 255, 204,0.3); border-radius: 5px;" class="clearfix">
<span class="float-left mr-5">{{ todo_items.task }}</span>
<form action="/deletetodo/{{ todo_items.id }}/" class = "float-right mx-2" method="POST" style ="display: inline;">
{% csrf_token %}
<input type="submit" class = 'btn btn-info btn-sm' value="Delete">
</form>
<span class="float-right p-1" style="background-color: rgba(204, 51, 255,0.7); border-radius: 5px;; font-size: small;">{{ todo_items.category }}</span>
<br>
<span style="font-size: small; color: rgb(255, 255, 102);"><strong>Details</strong> : {{ todo_items.description }}</span>
</li>
{% endfor %}
</ul>
</div>
对于我的 views.py 文件
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from todo_app.models import TodoItem
from todo_app.forms import TodoItemForm
# Create your views here.
def TodoView(request):
all_todo_items = TodoItem.objects.all()
return render(request,'index.html',{'all_items':all_todo_items})
def AddTodo(request):
if request.method == 'POST':
form = TodoItemForm(request.POST)
all_todo_items = TodoItem.objects.all()
if form.is_valid():
new_item = form.save(commit = False)
new_item.save()
return HttpResponseRedirect('/todo/')
else:
all_todo_items = TodoItem.objects.all()
form = TodoItemForm()
return HttpResponseRedirect('/todo/')
def DeleteTodo(request,todo_id):
item_to_delete = TodoItem.objects.get(id=todo_id)
item_to_delete.delete()
return HttpResponseRedirect('/todo/')
如果我注释掉 AddTodo 中的else部分,我会得到
ValueError at /addtodo/ 视图 todo_app.views.AddTodo 没有返回 HttpResponse 对象。 它返回 None 。
但是有了它,我只会被重定向到我的待办事项页面,而我的列表中没有新项目。
如果我为简单的 html 表单创建视图,例如
if request.method == 'POST':
task = request.POST.get('task')
category = request.POST.get('category')
description = request.POST.get('description')
new_item = TodoItem(task=task,category=category,description=description)
new_item.save()
return HttpResponseRedirect('/todo/')
else:
return HttpResponseRedirect('/todo/')
我遇到同样的问题。
请指出我的错误,我将不胜感激。
你必须渲染你的模板并将它传递给你的表单
return render(request, 'index.html', {'form': form})
而不是重定向。
因为那是在 else(GET,而不是 POST)中运行的内容。 您不会重定向 GET 分支。 否则,不会呈现带有表单的模板。 您在 POST 分支上的表单提交成功后执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.