首先,我很高兴来到这里,我最近读过您的文章,并在这里找到了有用的答案。
这是我的第一篇文章,所以请善待我,我是编程新手。
所以,我正在 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*)/$
当前 URL edit_task/
与其中任何一个都不匹配。
根 urls.py 看起来像:
url(r'', include('todo.urls'))
最佳答案
#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
View 也有潜在的错误>
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})
注意:我稍微修正了 View 中的代码。现在task_to_edit
当通过 GET
请求 View 时,也会传递到表单以填充字段。请注意,为了访问此 View ,浏览器中的 url 应如下所示 http://www.example.com/edit_task/2
如果您尝试访问 http://www.example.com/edit_task
如果不传递 ID,您将收到错误 404。
希望这有帮助!
关于python - 无法更新 CharField - Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16967285/