我正在开发一个Django博客应用程序,我有一个视图来编辑一篇文章。但是,当我单击“编辑”按钮时,表单字段不会显示为预先填充了现有数据。
下面是我的edit_post
视图代码:
def edit_post(request, post_id):
post = get_object_or_404(Post, id=post_id)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
if form.is_valid():
form.save()
return redirect("main_page")
else:
form = PostForm(instance=post)
context_dict = {
"form": form,
"post": post,
}
return render(request, "blog/edit_post.html", context_dict)
all_posts.html ->按钮,重定向到编辑文章页面。
<form method="POST" action="{% url 'edit_post' post.id %}">
{% csrf_token %}
<button type="submit" class="btn btn-secondary me-2 btn-sm">Edit</button>
</form>
edit_post.html:表单所在的代码部分。
<form method="POST">
{% csrf_token %}
{{ form.media }}
<div class="mb-3">
<label for="{{ form.title.id_for_label }}" class="form-label">Title</label>
{{ form.title }}
</div>
<div class="mb-3">
<label for="{{ form.summary.id_for_label }}" class="form-label">Summary</label>
{{ form.summary }}
</div>
<div class="mb-3">
<label for="{{ form.image_url.id_for_label }}" class="form-label">Image URL</label>
{{ form.image_url }}
</div>
<div class="mb-3">
<label for="{{ form.body.id_for_label }}" class="form-label">Body</label>
{{ form.body }}
</div>
<div class="mb-3">
<label for="{{ form.tags.id_for_label }}" class="form-label">Tags</label>
{{ form.tags }}
</div>
<button type="submit" class="btn btn-primary">Update Post</button>
</form>
我已经验证了PostForm是否正确配置了Post模型中的必需字段。我也尝试使用@never_cache
装饰器,但它没有解决这个问题。
我不知道为什么在提交表单后表单字段没有预先填充现有的数据。只有当我手动重新加载页面时才有效。
任何关于如何解决这个问题的建议或见解将不胜感激。
2条答案
按热度按时间1szpjjfi1#
好的,问题是按钮,它将用户带到编辑后视图!
只有当您希望发送数据时,才需要发出POST请求。但是你的按钮奇怪的是也发送一个POST请求。你必须改变这一点。这可能只是一个像这样的普通链接:
仅仅因为你向url传递了一个参数并不意味着这必须是一个POST请求!
您的案例中发生了什么:您的post-edit-view将其逻辑划分为POST和GET请求。通常,当用户“进入”编辑视图时,您希望触发视图的GET部分。然后表单将通过
PostForm(instance=post)
正确填充。在本例中,您已经通过POST请求访问了视图,因此视图的POST臂会被触发。在这里,您没有发送任何数据与请求,所以这个PostForm(request.POST, instance=post)
用空数据填充表单。q8l4jmvw2#
尝试这两种方法来解决问题。
检查这段代码,你的post对象不应该为null。
第二,从上下文中删除post对象,这不是必需的。