【问题标题】:How to preserve form fields in django after unsuccessful submit?提交不成功后如何在django中保留表单字段?
【发布时间】:2012-08-27 08:56:46
【问题描述】:

views.py 中的代码:

def feedback(request):
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            form.save()
        else:
            print("form.errors:", form.errors)
    else:
        form = CommentForm()
    articles = Comment.objects.all()
    ResponseDict = {"articles": articles, "form": form}
    return render_to_response("feedback.html", ResponseDict, 
        context_instance = RequestContext(request))

我已经尝试过这个以及对类似问题的答案的一些修改,但没有任何效果。当我按下提交按钮时,html中的所有表单字段都变为空。

编辑:来自 feedback.html 的代码:

{% extends "base.html" %}
{% block main %}
    <table>
        <form action="/feedback/" method="POST">
            {% csrf_token %}
            <div class="article">
                <label for="name">
                    Ваше имя:
                </label>
                <br />
                <input type="text" name="name" id="name" size="40" class="inputbox" value="" />
                <br />
                <!-- class="inputbox required" -->
                <textarea class="WithoutTinymce" cols="50" rows="10" name="text" id="text"></textarea>
                <br />
                <input type="submit" name="submit" value="Отправить">
            </div> <!-- /article -->
        </form>
    </table>
    {% include "articles.html" %}
{% endblock %}

如果需要,我也可以从 base.html 粘贴代码。

EDIT2:base.html 中的最小化代码:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
...
<body id="body-id" onload="loaded()">

<!-- Main -->
<div id="main" class="box">
    <div id="page" class="box">
        <div id="page-in" class="box">
            <!-- Content -->
            <div id="content">
                {% block main %}
                {% endblock %}
                <hr class="noscreen" />
            </div> <!-- /content -->
        </div> <!-- /page-in -->
    </div> <!-- /page -->
</div> <!-- /Main -->
</body>
</html>

【问题讨论】:

  • 您的代码似乎有效,您确定使用POST 方法发送表单吗?
  • 请发布您的表单模板源代码

标签: python django django-forms


【解决方案1】:

在您的模板中,您没有使用视图传递的form

您可以将部分模板更新为(假设表单中的字段名称为first_fieldsecond_field

<form action="/feedback/" method="POST">
    {% csrf_token %}
    <div class="article">
        <label for="name">
            Ваше имя:
        </label>
        <br />
        {{ form.first_field.errors }}
        {{ form.first_field.label_tag }}: {{ form.first_field }}
        <br />
        <!-- class="inputbox required" -->
        {{ form.second_field.errors }}
        {{ form.second_field.label_tag }}: {{ form.second_field }}
        <br />
        <input type="submit" name="submit" value="Отправить">
    </div> <!-- /article -->
</form>

更多参考 - Displaying form using template

【讨论】:

    【解决方案2】:

    您需要将表单传回模板;并且您需要按照 jpic 的link 在模板中呈现表单。

    以下应该呈现您的表单错误:

    from django.shortcuts import render, redirect
    
    def feedback(request):
        ctx = {}
        ctx['articles'] = Comment.objects.all()
        if request.method == "POST":
            form = CommentForm(request.POST)
            if form.is_valid():
                form.save()
                return redirect('/thanks')
            else:
                ctx['form'] = form
                return render(request, 'feedback.html', ctx)
        else:
            ctx['form'] = CommentForm()
        return render(request, "feedback.html", ctx)
    

    在您的模板中:

    {% extends "base.html" %}
    {% block main %}
        <table>
            <form action="/feedback/" method="POST">
                {% csrf_token %}
                <div class="article">
                    {{ form }}
                    <br />
                    <input type="submit" name="submit" value="Отправить">
                </div> <!-- /article -->
            </form>
        </table>
        {% include "articles.html" %}
    {% endblock %}
    

    【讨论】:

      【解决方案3】:

      简单,你的模板有这个:

      <input type="text" name="name" id="name" size="40" class="inputbox" value="" />
      

      所以输入标签的value属性始终为空。

      textarea 也是如此,它应该始终呈现为空:

      <textarea class="WithoutTinymce" cols="50" rows="10" name="text" id="text"></textarea>
      

      查看有关rendering a form in a template的文档

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2011-04-25
        • 2017-11-17
        相关资源
        最近更新 更多