Django edit_post视图不使用现有数据预填充表单字段

xsuvu9jc  于 2023-07-01  发布在  Go
关注(0)|答案(2)|浏览(79)

我正在开发一个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装饰器,但它没有解决这个问题。
我不知道为什么在提交表单后表单字段没有预先填充现有的数据。只有当我手动重新加载页面时才有效。
任何关于如何解决这个问题的建议或见解将不胜感激。

1szpjjfi

1szpjjfi1#

好的,问题是按钮,它将用户带到编辑后视图!
只有当您希望发送数据时,才需要发出POST请求。但是你的按钮奇怪的是也发送一个POST请求。你必须改变这一点。这可能只是一个像这样的普通链接:

<a href="{% url 'edit_post' post.id %}" class="btn btn-secondary me-2 btn-sm">
  Edit
</a>

仅仅因为你向url传递了一个参数并不意味着这必须是一个POST请求!
您的案例中发生了什么:您的post-edit-view将其逻辑划分为POST和GET请求。通常,当用户“进入”编辑视图时,您希望触发视图的GET部分。然后表单将通过PostForm(instance=post)正确填充。在本例中,您已经通过POST请求访问了视图,因此视图的POST臂会被触发。在这里,您没有发送任何数据与请求,所以这个PostForm(request.POST, instance=post)用空数据填充表单。

q8l4jmvw

q8l4jmvw2#

尝试这两种方法来解决问题。
检查这段代码,你的post对象不应该为null。

post = get_object_or_404(Post, id=post_id)

第二,从上下文中删除post对象,这不是必需的。

context_dict = {
            "form": form,
            }

相关问题