Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 初学者在Django中遇到URL问题_Python_Django_Url - Fatal编程技术网

Python 初学者在Django中遇到URL问题

Python 初学者在Django中遇到URL问题,python,django,url,Python,Django,Url,我正在尝试创建一个简单的Todo站点,允许您记录Todo并将其标记为已完成。我遇到的问题是URL 当你第一次去localholst:8000/待办事项/一切都很好,它显示了我所有的待办事项。我现在希望能够选中一个旁边的复选框,并让列表自动更新,并将该待办事项划掉。当您从localhost:8000/todo/执行此操作时,它可以正常工作,但您将留在localhost:8000/todos/check/3 url中(此url允许我通过regexp url捕获此视图,以在单击时使用该todo项更新数

我正在尝试创建一个简单的Todo站点,允许您记录Todo并将其标记为已完成。我遇到的问题是URL

当你第一次去localholst:8000/待办事项/一切都很好,它显示了我所有的待办事项。我现在希望能够选中一个旁边的复选框,并让列表自动更新,并将该待办事项划掉。当您从localhost:8000/todo/执行此操作时,它可以正常工作,但您将留在localhost:8000/todos/check/3 url中(此url允许我通过regexp url捕获此视图,以在单击时使用该todo项更新数据库)

问题:如果然后单击另一个todo项目将其标记为“完成”,则它将不起作用。如果我尝试单击id=4的todo项目,我的URL是localhost:8000/todos/check/3/check/4。您可以看到,在我做了一次之后,它使用url捕获更新数据库的视图,但是它应该将用户发送回localhost:8000/todo/以进行下一次检查。相反,它将我们留在localhost:8000/todos/check/3,并在末尾添加了“/check/4”

问题:在我处理了对数据库的实际更新之后,如何从url中丢失“check/3”

My main URL.py(指向我的todo/URL.py文件):

我的todo/URL.py文件:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^todo/', include("todo.urls", namespace="todo")),
)
最后是我的templates/todo/index.html文件(截断)


剩余{{todos_done{124; length}}个{{total}}
[  ]
    {待办事项中的待办事项百分比已完成%}
  • {{todo.todo_text}}
  • {%endfor%} {todo中todo的%u未完成%}
  • {{todo.todo_text}}
  • {%endfor%}
{%csrf_令牌%} 函数todoChecked(todo\U id){ 打开(“../todo/check/”+todo\u id); }
我想你只需按一下键。请用圆点而不是冒号来尝试:

<a href="{% url 'todo.remove' %}">Clear all done</a>

视图应重定向回该列表,而不是在
检查()中呈现待办事项列表:

from django.shortcuts import get_object_or_404, render

def check(request, todo_id):
    todo_to_mark = get_object_or_404(todo, id=todo_id) # @UndefinedVariable
    todo_to_mark.done = not todo_to_mark.done
    todo_to_mark.save()
    return redirect('todo:index')

另外,我建议使用快捷方式来获取
todo
对象。

既然您将它放在模板中,在javascript函数中,您可以使用Django的
url
模板标记。这或者使用绝对路径也可以解决问题,但卡塔瓦兰的答案是更好的解决方案。有一个
todo
名称空间,因此冒号是正确的。如果不是,则在尝试加载模板时会引发异常。dylrei的答案无效。我试过了。如果查看HTML文件,您将看到以这种方式引用的其他url,即{%url'todo:add%}。Catavarans的应答返回重定向(“todo:index”)工作正常,除非它在浏览器中打开了一个不可接受的新窗口。它应该只是重新加载相同的页面。可能是重定向调用的方法不对吗?是否有一个页面不打开另一个页面?新窗口将在javascript中打开:
窗口。打开(“../todo/check/”+todo\u id)
。我的回答只是解决了特定于url的问题。是否有办法在同一窗口中打开它。是的,
window.location=“../todo/check/”+todo\u id将在当前窗口中加载页面。
    <div>
    <span>{{ todos_done|length }} of {{ total }} remaining</span>
    [ <a href="{% url 'todo:remove' %}">Clear all done</a> ]

    <ul class="unstyled">
        {% for todo in todos_done %}
            <li>
                <input type="checkbox" name="todo{{todo.id}}" id="{{todo.id}}" onchange="todoChecked({{todo.id}})" checked>
                <span class="done-true">{{ todo.todo_text }}</span>
            </li>
        {% endfor %}

        {% for todo in todos_not_done %}
            <li>
                <input type="checkbox" name="todo{{todo.id}}" id="{{todo.id}}" onchange="todoChecked({{todo.id}})" >
                <span>{{ todo.todo_text }}</span>
            </li>
        {% endfor %}
    </ul>

    <form action="{% url 'todo:add' %}" method="post">
    {% csrf_token %}
        <input type="text" size="30" name="new_text" id="new_text" placeholder="Add new todo here">
        <input class="btn-primary" type="submit" value="Add">
    </form>

    <!-- Javascript function -->
    <script>
        function todoChecked(todo_id) {
            window.open("../todo/check/" + todo_id); 
        }
    </script>
</div>
<a href="{% url 'todo.remove' %}">Clear all done</a>
from django.shortcuts import get_object_or_404, render

def check(request, todo_id):
    todo_to_mark = get_object_or_404(todo, id=todo_id) # @UndefinedVariable
    todo_to_mark.done = not todo_to_mark.done
    todo_to_mark.save()
    return redirect('todo:index')