【问题标题】:Update view not displaying data更新视图不​​显示数据
【发布时间】:2023-04-06 23:01:01
【问题描述】:

我有一个基于函数的视图,它不加载输入的数据。该视图根本不会引发任何错误。它只是将表单显示为空白。

urls.py

    path('edit/<slug>/', editPost, name='edit'),

views.py

@login_required
def editPost(request, slug):
    if request.method == 'POST':
        post = get_object_or_404(Post, slug=slug)
        form = PostForm(request.POST or None, request.FILES or None, instance=post)
        if form.is_valid():
            post.author = request.user.username
            post.updated = True
            form.save()
            return redirect('dashboard')
    else:
        form = PostForm(request.POST, request.FILES, instance=post)
    return render(request, 'edit_post.html', {'form': form})

模板

<form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">{% csrf_token %}
                                    <input class="btn btn-sm" type="submit" value="Edit">

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    模板中渲染表单,使用{{ form.as_p }}

    <form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">
        {% csrf_token %}
      <!-- render form here -->
      {{ form.as_p }}
      <input class="btn btn-sm" type="submit" value="Edit">
    </form>
    

    遍历表单字段作为

    <form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post">
        {% csrf_token %}
        <!-- render form here -->
        {% for field in form %}
          {{ field.label }}
          {{ field }}
          {{ field.error }}
        {% endfor %}
      <input class="btn btn-sm" type="submit" value="Edit">
    </form>
    

    【讨论】:

    • 它仍然给出一个空白页。事实上,我已经有了试图用 URL 指向的 edit_post.html。我现在什至在 URL 链接中呈现了表单,但仍然给出空白
    • URL 不是重定向到“edit_post.htm”形式吗?我很困惑为什么您要在同一个视图中呈现表单及其重定向 URL。我在想,当您单击 URL 时,它会将您带到“edit_post.html”,然后将内容提交到后端
    • 另外,我在文本字段中使用了 CKEDITOR。会不会是另一种情况?谢谢
    【解决方案2】:
    @login_required
    def editPost(request, slug):
        post = get_object_or_404(Post, slug=slug)
        if request.method == 'POST':
            form = PostForm(request.POST or None, request.FILES or None, instance=post)
            if form.is_valid():
                post.author = request.user.username
                post.updated = True
                form.save()
                return redirect('dashboard')
        else:
            form = PostForm(instance=post)
        return render(request, 'edit_post.html', {'form': form})
    

    可能你必须做这样的事情,当你在视图中没有 POST 操作时,没有任何理由传递 request.POSTrequest.FILES。这样,您只需传递具有所有相关信息的 post 对象。

    您还必须以下列方式呈现您的表单:

    <form class="dropdown-item" action="{% url 'edit' slug=post.slug %}" method="post" enctype="multipart/form-data">
        {% csrf_token %}
      <!-- render form here -->
      {{ form.as_p }}
      <input class="btn btn-sm" type="submit" value="Edit">
    </form>
    

    请注意,enctype="multipart/form-data" 是强制性的,因为您在其他地方处理表单中的文件,它将无法正常工作。

    还要检查你必须把post = get_object_or_404(Post, slug=slug) 行放在哪里,因为这样你可以将对象传递给正在执行的任何操作(POST 或 GET)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多