Python 初学者在Django中遇到URL问题
我正在尝试创建一个简单的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文件: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项更新数
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')