繁体   English   中英

在Django中重新显示带有先前提交的错误数据的表单

Redisplay Form with Previously Submitted Data on Error in Django

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

遇到错误后,如何使提交的数据重新显示在表单集中? Django的书谈到了这一点,我能够使它以某种形式而不是某种形式工作。

方案:有2个必填字段-名和姓。 如果我仅在名字字段中输入'John',而姓氏字段为空,然后单击Submit,我将收到一条错误消息,指出这两个字段都是必填字段,并且表单使用错误消息清除了提交的数据。 我想在名字字段中看到名字“ John”以及错误消息。

非常感激!

**forms.py**

from django import forms
from django.forms.formsets import BaseFormSet


class NameForm (forms.Form):

    first_name = forms.CharField (max_length = 20, required = False)
    last_name = forms.CharField (max_length = 20, required = False)


class BaseNameFormSet (BaseFormSet):

    def clean (self):
        if any (self.errors):
            return

        firstnames = []
        lastnames = []
        for form in self.forms:
            firstname = form.cleaned_data.get ('first_name')
            lastname = form.cleaned_data.get ('last_name')

            if (firstname in firstnames) or (lastname in lastnames):
                raise forms.ValidationError ('First or last name must be unique')
            if (firstname == '') or (lastname == ''):
                raise forms.ValidationError ('Both first and last name must be filled out')

            firstnames.append (firstname)
            lastnames.append (lastname)

        return self.cleaned_data


**views.py**

from django.shortcuts import render
from django.forms.formsets import formset_factory
from nameform.forms import NameForm
from nameform.forms import BaseNameFormSet
from nameform.addName import webform


# Create your views here.
def addname (request):

    # Set maximum to avoid default of 1000 forms.
    NameFormSet = formset_factory (NameForm, formset = BaseNameFormSet, extra = 2, max_num = 5)

    if request.method == 'POST':
        # Django will become valid even if an empty form is submitted. Adding initial data causes unbound form and
        # trigger formset.errors
        # formset = NameFormSet (request.POST, initial = [{'first_name': 'John', 'last_name': 'Doe'}])
        formset = NameFormSet (request.POST)

        if formset.is_valid ():
            location = request.POST ['site']
            data = formset.cleaned_data

            for form in data:
                # Retrieving the value in an empty dictionary will result key error as it doesn't exist
                # firstname = form ['first_name']
                # lastname = form ['last_name']

                firstname = form.get ('first_name')
                lastname = form.get ('last_name')

                if firstname and lastname:
                    webform (firstname, lastname, location)

            context = {'data': data, 'location': location}

            return render (request, 'nameform/success.html', context)

    else:
        formset = NameFormSet ()

    return render (request, 'nameform/addname.html', {
        'formset': formset,
        'first_name': request.POST.get ('first_name', ''),
        'last_name': request.POST.get ('last_name', '')
    })


**addname.html**

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Add Name</title>
</head>
<body>
    <h1>Add Name</h1>
    <form action="" method="POST">{% csrf_token %}
        <h3>Location:</h3>
        <p><input type="radio" id="radio1" name="site" value="Location_A" checked>
        <label for="radio1">Location A</label>
        <input type="radio" id="radio2" name="site" value="Location_B">
        <label for="radio2">Location B</label></p>
        {{ formset.management_form }}
        <label for="id_form-0-first_name">First Name:</label>
        <input id="id_form-0-first_name" maxlength="20" name="form-0-first_name" type="text" value="{{ first_name }}" />
        <label for="id_form-0-last_name">Last Name:</label>
        <input id="id_form-0-last_name" maxlength="20" name="form-0-last_name" type="text" value="{{ last_name }}" />
        <p><label for="id_form-1-first_name">First Name:</label>
        <input id="id_form-1-first_name" maxlength="20" name="form-1-first_name" type="text" value="{{ first_name }}" />
        <label for="id_form-1-last_name">Last Name:</label>
        <input id="id_form-1-last_name" maxlength="20" name="form-1-last_name" type="text" value="{{ last_name }}" /></p>
        <p><input type="submit" value="Add Name"></p>
    </form>

    {% if formset.errors %}
    <p style="color: red;">Please correct the error below:</p>
    {{ formset.non_form_errors }}
    {% endif %}

</body>
</html>

形成

在Shell中:

>>> partial_data = {
...     'form-TOTAL_FORMS': '2',
...     'form-INITIAL_FORMS': '0',
...     'form-MAX_NUM_FORMS': '3',
...     'form-0-first_name': 'John',
...     'form-0-last_name': 'Doe',
...     'form-1-first_name': 'James',
...     'form-1-last_name': ''
... }
>>> 
>>> NameFormSet = formset_factory (NameForm, formset = BaseNameFormSet)
>>> formset = NameFormSet (partial_data)
>>> 
>>> formset.is_valid ()
False
>>> formset.errors
[{}, {}]
>>> formset.non_form_errors ()
['Both first and last name must be filled out']
2 个回复

表单集与表单完全相同,只需将其与request.POST一起加载即可。

这是我的一个项目中的一些代码。

formset = modelformset_factory(PaymentTemplates, extra=extras, form=PaymentTemplateForm)
    if request.POST:
        formset = formset(request.POST)

在您的模板中:

{% if formset.total_error_count %}
    <ul class="errorList">
    {% for dict in formset.errors %}
        {% for error in dict.values %}
        <li>{{ error }}</li>
        {% endfor %}
    {% endfor %}
    </ul>
{% endif %}

我想你也知道你需要这个:

<form action="..." method="POST">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
    {{ form.as_table }}
{% endfor %}
</form>

查找如何手动呈现表单,或使用诸如脆皮表单或带有模板标签的django-bootstrap3之类的东西来处理所有这些。

事实证明,我需要在下面进行更改。 此处的关键是将“ first_name_0”变量与html中的“ form-0-first_name”输入字段相关联。 如果使变量和html输入框的名称相同,则会出现错误。

例如:

return render (request, 'nameform/addname.html', {
        'formset': formset,
        'form-0-first_name': request.POST.get ('form-0-first_name', '')})

Django不喜欢这种格式。 而是使其与下面的内容相同,以将哪个输入字段与变量匹配。

views.py

...
...
...
    return render (request, 'nameform/addname.html', {
        'formset': formset,
        'first_name_0': request.POST.get ('form-0-first_name', ''),
        'last_name_0': request.POST.get ('form-0-last_name', ''),
        'first_name_1': request.POST.get ('form-1-first_name', ''),
        'last_name_1': request.POST.get ('form-1-last_name', '')

addname.hmtl

   ...
    ...
    ...
    {{ formset.management_form }}
            <label for="id_form-0-first_name">First Name:</label>
            <input id="id_form-0-first_name" maxlength="20" name="form-0-first_name" type="text" value="{{ first_name_0 }}" />
            <label for="id_form-0-last_name">Last Name:</label>
            <input id="id_form-0-last_name" maxlength="20" name="form-0-last_name" type="text" value="{{ last_name_0 }}" />
            <p><label for="id_form-1-first_name">First Name:</label>
            <input id="id_form-1-first_name" maxlength="20" name="form-1-first_name" type="text" value="{{ first_name_1 }}" />
            <label for="id_form-1-last_name">Last Name:</label>
            <input id="id_form-1-last_name" maxlength="20" name="form-1-last_name" type="text" value="{{ last_name_1 }}" /></p>

预期结果:

现在,用户无需重新填写整个表格即可知道他们做错了什么或缺少了什么。

Add_Name

2 用先前提交的数据重新填充骨干表单的集合

我能够将表单发布到数据库中,并且逐步执行了后端功能,以检查并确认Get函数返回的是我提交的相同数据。 但是,我在理解如何再次访问该页面时呈现此数据时遇到了麻烦。 我想念什么? 目的是能够为可变的个人集合创建,读取,更新或删除(CRUD)一些个人联系数据。 ...

4 如何从先前提交的表单访问POST数据

我有一个表单,用户将通过POST向PHP提交多个值。 PHP接受输入,如果输入的数据有效,它将显示第二个表单供用户填写。 用户填写第二个表单后,我需要再次处理在第一个表单中输入的数据以及在第二个表单中输入的数据。 从第一个PHP表单访问表单数据的最佳方法是什么? 是否应该 ...

2016-04-25 21:35:57 1 30   php/ forms
5 返回先前提交的表单数据并进行更新

我是Orbeon的新手。 也许这是一个愚蠢的问题,但是我还是要问:在Orbeon中,第一次提交表单后是否可以更改表单数据? 我的意思是,假设我是一名学生,正在使用Orbeon将我的一些个人信息输入表格。 提交数据后,我记得我忘记了一些数据或通知了一些错误,然后我想回来,找到我之前放置的数据 ...

2014-09-08 13:20:46 1 68   orbeon
6 使mongodb中的数据以先前提交的html格式显示

我想获取保存在数据库中的数据以再次显示相同的表单(表单中包含诸如姓,名,身份证,电话号码等字段)的表单。我保存了html表单,提交数据后,将数据保存在数据库中,我想要再次获得他们的位置 我想当某人登录时可以转移到他的数据表格时,他提交的任何人都可以理解我吗? ...

8 Codeigniter DB查询链接先前调用中的错误数据

这就是我模型中的内容。 我继承了其他人的代码并尝试对其进行清理(尚无法更改列名称) CodeIgniter返回以下输出错误: 错误号:1066 不是唯一的表格/别名:“广告” 添加的JOIN来自上一条语句。 我尝试添加 但这无济于事 编辑:上一个 ...

9 VSC突出显示先前提交的更改

进行当前更改时,Visual Studio Code突出显示这些更改,如下所示: 我喜欢这个绿色的亮点。 默认情况下,此突出显示仅显示当前更改,而在提交后消失。 有没有办法突出显示当前分支的先前提交的更改? ...

10 Django 模型字段在写入错误数据后重新对齐

在我的 Django 管理面板中,每当我将字段留空并保存时,字段都会从左到右重新对齐,反之亦然。 在下面的图片中,第一张图片是字段中没有数据的情况。 第二张图片是当我将字段留空并保存时,该字段已从左到右重新对齐。 谁能告诉我是什么问题以及如何解决这个问题? ![在我的面板中写入任何内容之前[![将 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM