1

首先我很高兴来到这里,我最近读到了你,我在这里找到了有用的答案。
这是我的第一篇文章,所以请善待我,我是编程新手。

所以,我正在用 Django 编写我的第一个 Web 应用程序 - 一个待办事项应用程序,但我不知道如何编写执行此操作的函数。我在 Django 文档和其他相关讨论中发现了一些东西,但它不起作用。

这是我的代码:

#models.py

class Task(models.Model):
user = models.ForeignKey(User)
task = models.CharField(max_length=200)
initialized_at = models.DateTimeField(auto_now_add=True)
due_date = models.DateField(default=datetime.now)
done = models.BooleanField(default=False)

def __unicode__(self):
    return self.task

#views.py
def edit_task(request, id):
if request.method == 'POST':
    task_to_edit = Task.objects.get(pk=task_id)
    form = TaskForm(request.POST, instance=task_to_edit)
    form.save()
    if form.is_valid():
        task_to_edit = form.save()
    return HttpResponseRedirect('/')
else:
    form = TaskForm()
return render(request, 'todo/edit_task.html', {'form': form})

#urls.py
url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task')

#edit_task.html
{% block content %}
<form action="/edit_task/" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}

当我提交更新的表单时,我收到此错误:

Page not found (404)
Request Method:     POST
Request URL:    hxxp://127.0.0.1:8000/edit_task/

使用 jbz.urls 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式:

^admin/
^$ [name='index']
^(?P<task_id>\d+)/$
^(?P<task_id>\d+)/$
^add-task/$
^delete-task/(?P<task_id>\w+)/$
^edit_task/(?P<id>\w+)/$
^done/(?P<task_id>\d*)/$

当前 URLedit_task/与其中任何一个都不匹配。

根 urls.py 看起来像:

url(r'', include('todo.urls'))
4

3 回答 3

1
#edit_task.html
{% block content %}
<form action="/edit_task/{{task.id}}" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}

注意我是如何添加{{task.id}}表达式的<form action="/edit_task/{{task.id}}" method="post">

重要提示:替换{{task.id}}为在您的模板中完成此操作的任何变量。

你得到错误的原因是因为edit_task/没有得到另一部分task_id来匹配正则表达式:

url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task')

更新:您的edit_task观点也有潜在的错误>

def edit_task(request, id):
    task_to_edit = Task.objects.get(pk=id)
    if request.method == 'POST':
        form = TaskForm(request.POST, instance=task_to_edit)
        form.save()
        if form.is_valid():
            task_to_edit = form.save()
        return HttpResponseRedirect('/')
else:
    form = TaskForm(instance=task_to_edit)
# you don't pass any task variable to the view so the form view
# won't know which task to edit, you'll have to handle that
return render(request, 'todo/edit_task.html', {'form': form, 'task':task_to_edit})

注意:我稍微更正了视图中的代码。现在,task_to_edit当通过 请求视图时,也将 传递给表单以填充字段GET。请注意,为了访问此视图,浏览器中的 url 应如下所示http://www.example.com/edit_task/2

如果您尝试在http://www.example.com/edit_task不传递 id 的情况下访问,您将得到Error 404

希望这可以帮助!

于 2013-06-06T16:28:58.167 回答
0

我认为您的编辑任务模式需要一个 id - 任务名称。尝试更改您的 URL 模式:

'^edit_task/(?P<task_id>\w+)/$'

'^edit_task/$'

或提供您要编辑的任务 ID。

于 2013-06-06T16:31:20.600 回答
0

只需将名称空间添加到您的 url 并相应地更新您的模板。

#urls.py
url(r'^edit_task/(?P<task_id>\w+)/$', 'todo.views.edit_task', name= "edit_task")

#edit_task.html
{% block content %}
<form action="{% url 'edit_task' task_id %}" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>
{% endblock content %}
于 2013-06-06T18:46:44.837 回答