繁体   English   中英

/addtodo/ 处的 ValueError:无法在待办事项列表中添加新项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM