【问题标题】:remembering form field value on django model form记住 Django 模型表单上的表单字段值
【发布时间】:2014-02-10 13:48:12
【问题描述】:

我对 Django 很陌生,并且一直在玩 ModelForms。到目前为止,我已经能够轻松地创建 ModelForms。但是,有一个问题似乎让我有些烦恼:

当用户填写表单时,如果出现错误(比如 int 而不是 char 或缺少 blank=False 值),表单会吐出错误并且似乎忘记了 em> 表单验证失败时用户输入的值。我想知道是否有办法记住这些值,以便用户不必再次输入它们。

目前,我有以下内容:

class ContactForm(CreateView):

    form_class = ContactForm
    template_name = "superform.html"
    success_url = '/ty/'

    def form_valid(self, form):
        # do something useful with validated form
        return super(ContactForm, self).form_valid(form)

    def form_invalid(self, form):
        # do something useful with invalidated form.
        return super(ContactForm,self).form_invalid(form)

我假设我需要在 form_invalid 中执行某些操作以将值传递回表单 - 但我不确定如何执行此操作(?)。

如果有人能指出我正确的方向,我将不胜感激。

谢谢。

----编辑---

            <form class="form" role="form" action="{% url 'coolurl' %}" method="post">{% csrf_token %}

                    {% if form.non_field_errors %}
                      <div class="alert">
                      {% for error in form.non_field_errors %}
                      <span class="label">Error: {{ error|escape }}</span> 
                      {% endfor %}
                      </div>
                    {% endif %}


                    <div class="form-group">
                        {% if form.name.errors %}
                          <div class="alert">
                          {% for error in form.name.errors %}
                          <span class="label">Error: {{ error|escape }}</span> 
                          {% endfor %}
                          </div>
                        {% endif %}

                        <label class="col-sm-3" for="id_name">Name:</label>
                        <div class="col-sm-6">
                        <input class="form-control" 
                             id="id_name" 
                             type="text" 
                             name="name" 
                             maxlength="128" 
                             placeholder="Your name..">
                        </div>
                    </div>

                    <button type="submit" class="btn btn-success">Submit</button>
            </form>

【问题讨论】:

  • 不,这应该是默认行为。请您出示您的表单模板吗?
  • 听起来您的模板有问题。绝对与ajax无关
  • @DanielRoseman,Anentropic:感谢您的评论。您所说的很有道理,因为当我使用{{form_as.p}} 时,一切都很好,即使出现错误,它似乎也能记住用户输入的值。我现在展示了我的模板(因为表单标记很大,所以只有一个字段)。想知道我在做什么与{{form_as.p}} 不同。
  • 仅供参考:我正在使用 twitter bootstrap 生成表单标记。

标签: python django django-models django-forms


【解决方案1】:

尝试提及input标签的值:

<input class="form-control" 
                             id="id_name" 
                             type="text" 
                             name="name" 
                             maxlength="128"
                             value="{{ form.name.value|default_if_none:'' }}"
                             placeholder="Your name..">
                        </div>

【讨论】:

  • 你摇滚! :) 你的回答对所有input 标签有用!除了textarea - value 似乎在此下不起作用。有什么想法吗? :(
  • 好的,我明白了。只是在 textarea 的值上直接使用了{{...}}。再次感谢 - 你为我节省了很多时间。接受你的回答!
【解决方案2】:

您已经承担了将这些字段从 Django 中呈现出来的责任,只需将它们硬编码到 HTML 中即可。这意味着 Django 无法插入当前值;不仅在错误后重新显示时,而且在您有一个修改现有数据库内容的表单时也是如此。

不要那样做。我知道您不想只考虑form.as_p,但有一个很好的中间立场:使用{{ form.my_field }} 输出模板中的每个字段。您可以在forms.py中定义的字段中添加相关的类,然后Django会负责正确输出。

【讨论】:

  • 我同意你的评论。在这种情况下,arocks 的答案有效!
猜你喜欢
  • 2012-05-13
  • 2020-11-30
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
相关资源
最近更新 更多