我正在尝试使用我已提交到前一个HTML页面(也就是ModelForm)的一些数据填充ModelForm。 我只想将其传递给另一种形式,因此不必编写两次。 我已经尝试了来自stackoverflow的几个解决方案,但是它们已有6年以上的历史,有点过时了,也无法提供django docs h ...
提示:本站收集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']
表单集与表单完全相同,只需将其与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>
预期结果:
现在,用户无需重新填写整个表格即可知道他们做错了什么或缺少了什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.