手动示例: http://docs.djangoproject.com/en/1.0/topics/forms/formsets/#formset-validation(我正在使用Django 1.0.3在Google App Engine上运行)
码:
from django import forms
from django.forms.formsets import formset_factory
class ArticleForm1(forms.Form):
title = forms.CharField()
pub_date = forms.DateField()
class ArticleForm2(forms.Form):
title = forms.CharField()
class ArticleForm3(forms.Form):
title = forms.CharField()
pub_date = forms.CharField()
ArticleFormSet1 = formset_factory(ArticleForm1)
ArticleFormSet2 = formset_factory(ArticleForm2)
ArticleFormSet3 = formset_factory(ArticleForm3)
data = {
'form-TOTAL_FORMS': u'2',
'form-INITIAL_FORMS': u'0',
'form-0-title': u'',
'form-0-pub_date': u'16 June 1904',
'form-1-title': u'', # <-- this title is missing but required
'form-1-pub_date': u'16 June 1904', # <-- this date is missing but required …Run Code Online (Sandbox Code Playgroud) 我想在inlineformset_factory表单中更改默认上载字段(FileField),以使用django.contrib.admin.widgets中的AdminFileWidget.这样做的目的是显示当前上传文件的路径,就像在管理表单中一样(也许还有另一种方法可以做到这一点?).
我可以毫不费力地使用自定义表单来使用窗口小部件,但是无法弄清楚如何在inlineformset_factory中更改窗口小部件.
出于某种原因,我提交后,我的formset将无法验证.关于这种方式的任何想法都可能发生?
class Department(models.Model):
department = models.CharField(verbose_name = "Department Name", max_length=100)
description = models.TextField(verbose_name = "Description", blank=True, null=True)
sp_description = models.TextField(verbose_name = "Description (Spanish)", blank=True, null=True)
phone = PhoneNumberField()
phone_ext = models.CharField(max_length=10, blank=True)
#Relations
provider = models.ForeignKey(Provider, blank=True, null=True)
services_offered = models.ManyToManyField(ServiceType)
def __unicode__(self):
return self.department
Run Code Online (Sandbox Code Playgroud)
def display_step5(request):
msg = ''
email = request.session.get('email')
provider_obj = retrieve_provider_instance(email)
AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
if is_authenticated(request):
AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
if request.method=='POST':
if 'add_department' in request.POST:
cp = request.POST.copy()
cp['department-TOTAL_FORMS'] …Run Code Online (Sandbox Code Playgroud) 我使用inlineformset_factory来生成一个formset,如下所示:
FormSet = inlineformset_factory(Model1, Model2, extra=0)
if request.method =="POST":
formset = FormSet(request.POST, instance=model1_object)
if formset.is_valid():
formset.save()
return HttpResponseRedirect( reverse-blah )
else:
formset = PupsFormSet(instance=model1_object,)
return render_to_response("template.html", {"formset":formset, 'model1_object':model1_object},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)
我有两个问题
更新了功能代码回答问题#1
FormSet = inlineformset_factory(Model1, Model2, extra=0)
if request.method =="POST":
formset = FormSet(request.POST, instance=model1_object, queryset=Model2.objects.filter(foo=bar))
if formset.is_valid():
formset.save()
return HttpResponseRedirect( reverse-blah )
else:
formset = PupsFormSet(instance=model1_object, queryset=Model2.objects.filter(foo=bar))
return render_to_response("template.html", {"formset":formset, 'model1_object':model1_object},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud) django django-forms formset django-class-based-views class-based-views
关于Django 1.4和表单集,我一直遇到一个奇怪的问题:当提交的数据不变时,即使表单集本身通过了验证,表单集的cleaned_data字段也为空。
这是一个例子:
forms.py:
class NameForm(forms.Form):
name = forms.CharField(required=False, initial='Foo')
Run Code Online (Sandbox Code Playgroud)
views.py:
def welcome(request):
Formset = formset_factory(NameForm, extra=1)
if request.method == 'POST':
formset = Formset(request.POST)
print '1.Formset is valid?', formset.is_valid()
print '2.Formset', formset
print '3.Formset cleaned_data', formset.cleaned_data
else:
formset = Formset()
return render_to_response('template.html', locals())
Run Code Online (Sandbox Code Playgroud)
尽管它formset是有效的,并且实际上包含数据,但第3行将打印一个空字典的列表,除非我实际上已更改了该字段中的初始值。
这对我来说似乎很奇怪,但是我可能做错了什么。有什么帮助吗?
我使用formset产生额外的字段,但是我不知道如何更改formset产生的额外字段的标签。
我的代码:
class GetMachine(forms.Form):
Number_of_Lines = forms.IntegerField(max_value=4)
class GetLine(forms.Form):
beamline_name = forms.CharField(max_length=15, label='Name of Beamline-%i')
def install(request):
MachineFormSet = formset_factory(GetMachine, extra=1)
formset = MachineFormSet()
if request.method == 'POST':
# formset = MachineFormSet(request.POST)
# if formset.is_valid(): # All validation rules pass
line_no = request.POST['form-0-Number_of_Lines']
GetLineFormSet = formset_factory(GetLine, extra=int(line_no))
formset = GetLineFormSet()
return render_to_response('install.html', { 'formset': formset, 'action': 'step1'})
return render_to_response('install.html', { 'formset': formset, })
Run Code Online (Sandbox Code Playgroud)
install.html模板:
{% for form in formset.forms %}
{% for field in form %}
<tr>
<td>{{ field.label_tag }}</td> …Run Code Online (Sandbox Code Playgroud) 我有以下视图代码
account = PatientAccount.objects.get(pk=account_id)
payments = Payments.objects.filter(account=account)
total_cost = 0
for hasjob in account.hasjobs.all().select_related('job'):
total_cost += hasjob.quantity * hasjob.job.cost*(1.0 - hasjob.discount / 100.0)
PaymentFormset = modelformset_factory(Payments, form=PaymentModelForm, can_delete=False)
formset = PaymentFormset(request.POST or None, queryset=payments)
if request.method == 'POST':
print formset.is_valid()
if formset.is_valid():
for form in formset:
if form.is_valid():
try:
if form.cleaned_data.get('DELETE') and form.instance.pk:
form.instance.delete()
else:
instance = form.save(commit=False)
print instance.pk
instance.account = account
print instance.account
instance.save()
messages.success(request, "Payments saved successfully")
except DatabaseError:
messages.error(request, "Database error. Please try again")
return redirect('job_management-edit', …Run Code Online (Sandbox Code Playgroud) views.py中的formset创建:
ffact = formset_factory(Form,extra=somenum]))
fset = ffact(prefix='pfix')
Run Code Online (Sandbox Code Playgroud)
views.py中的验证:
ffact = formset_factory(Form,extra=3))
fset = ffact(request.POST)
if fset_is.valid():
blah blah
Run Code Online (Sandbox Code Playgroud)
这导致异常类型:ValidationError at/app/index/Exception Value:[u'ManagementForm数据丢失或被篡改'] django-docs 确实提到了这一点.我不确定如何提供管理数据.我试着像这样,
try:
fset = ffact(request.POST)
except ValidationError:
fset = None
if fset and fset.is_valid():
blah blah
Run Code Online (Sandbox Code Playgroud)
但我仍然得到同样的错误.任何想法?谢谢.
我正在尝试使用一个表单来允许用户将图像上传到存储在我的 Django 项目的数据库中的项目,但是,我当前收到的控制台输出告诉我我formset正在使用的内容无效...
我尝试用来将图像上传到项目的视图已定义为:
def upload_budget_pdfs(request, project_id):
project = Project.objects.get(id=project_id)
print("Value of project in 'upload_budget_pdfs()': ", project)
presentations = project.budget_versions.select_related('meeting').prefetch_related('budget_items', 'cci_items', 'presenters').filter(version_number__isnull=False).annotate(vn=F('version_number') * -1).order_by('presentation_date', 'created', '-vn')
print("Value of presentations in 'upload_budget_pdfs()': ", presentations)
drawing_formset = DrawingUploadFormset(prefix="drawings", queryset=Drawing.objects.filter(budget__in=presentations).order_by('budget__presentation_date', 'budget__created'))
print("Value of drawing_formset in 'upload_budget_pdfs()': ", drawing_formset)
if drawing_formset.is_valid():
print 'Saving drawing_formset'
print "Before", [b.id for b in project.budget_versions.all()]
for drawing_form in drawing_formset:
if drawing_form.instance.budget:
print 'Instance', drawing_form.instance.budget
drawing = drawing_form.save(commit=False)
drawing.budget = drawing_form.instance.budget
drawing.save()
print drawing, [b.id for b …Run Code Online (Sandbox Code Playgroud) 我正在使用htmx i制作带有嵌套动态表单集的表单(想要逃避 usign JS,但如果别无选择...)来实例化更多表单集字段以制作动态嵌套表单,但是当我POST时,仅来自1 个实例(最后一个)的数据被 POSTed,表单的其余部分正确 POST,并且获取与Chlid formset Child modelParent model
我阅读了有关如何POST 表单集实例的django 文档,并尝试将其应用到我的代码中,我也知道如何同时发布这 两个实例。对于表单集,我正在向包含子表单集的部分模板发出 htmx get 请求hx-get ,效果很好,唯一的问题是这总是将表单集返回到客户端,因此对于POST数据会重复每个字段的次数,并且只获取最后一个实例中放置的数据,但是我尝试更改表单集上的值以使更多表单直立,这给出了预期的结果,每个表单一个子实例,所以我的问题是htmx以及我调用实例的方式。ParentChildform-0xextra=intextra=intnew Child formset
这是我的代码。(我计划在此表单中嵌套更多子表单集,因此为了方便起见,我将其称为sformset)
****views.py****
def createPlan(request):#Requst for the Parent form
form = PlanForm(request.POST or None)
sformset = StructureFormset(request.POST or None) #Nesting the Child formset
context = { …Run Code Online (Sandbox Code Playgroud)