Django Formset.is_valid 缺少 1 个必需的位置参数:'self'
Django Formset.is_valid missing 1 required positional argument: 'self'
我正在调试我的程序,我注意到在行 Formset.is_valid
上出现错误:
missing 1 required positional argument: 'self'
能否请您告知如何解决才能使 formset
和所有表单成功验证并保存到数据库中。另外,是否需要双重验证(formset
和 form
)?感谢您的见解。
views.py
from django.shortcuts import render
from .forms import modelformset_factory, AssumptionsForm
from .models import Assumptions
import pdb
model_names = ['Form1', 'Form2']
def get_assumptions(request):
if request.method == 'POST':
print('Reached post')
formset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
pdb.set_trace()
for thing in model_names:
if thing in request.POST:
print('template name in model_names')
if formset.is_valid():
for form in formset:
if form.is_valid():
print('in for loop after valid form1')
assumptions = form.save(commit='False')
assumptions.Name = thing
assumptions.save()
else:
formset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
print('reached else')
return render(request, 'assumptions.html', {'formset': formset, 'model_names': model_names})
models.py
from django.db import models
from django.forms import ModelForm
class Assumptions(models.Model):
Worst_Case = models.FloatField(null=True, blank=True, default=None)
Grey_Case = models.FloatField(null=True, blank=True, default=None)
Red_Case = models.FloatField(null=True, blank=True, default=None)
Blue_Case = models.FloatField(null=True, blank=True, default=None)
Green_Case = models.FloatField(null=True, blank=True, default=None)
Best_Case = models.FloatField(null=True, blank=True, default=None)
Name = models.TextField(null=True, blank=True, default=None)
assumptions.html
<div class="form">
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors.as_ul }}
{% for vardas in model_names %}
<h1>{{vardas}}</h1>
<table id="formset" class="form">
{% for form in formset.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="hidden" name="{{vardas}}" />
{% endfor %}
<input type="submit" value="Next">
</form>
</div>
forms.py
from django import forms
from django.forms import modelformset_factory, ModelForm
from .models import Assumptions
class AssumptionsForm(ModelForm):
class Meta:
model = Assumptions
fields = ['Worst_Case', 'Grey_Case', 'Red_Case', 'Blue_Case', 'Green_Case', 'Best_Case']
exclude = ['Name']
您还没有实例化您的表单集。工厂是 returns 一个 class,所以这里 modelformset_factory
returns 一个表单集 class 然后你需要在你的 get 和 [=19] 中实例化=]块。
def get_assumptions(request):
AssumptionsFormset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
if request.method == 'POST':
formset = AssumptionsFormset(request.POST)
if formset.is_valid():
...
else:
formset = AssumptionsFormset()
return render(request, 'assumptions.html', {'formset': formset, 'model_names': model_names})
另请注意,您不需要在每张表格上检查 is_valid()
;如果表单集有效,则所有表单都有效。
我正在调试我的程序,我注意到在行 Formset.is_valid
上出现错误:
missing 1 required positional argument: 'self'
能否请您告知如何解决才能使 formset
和所有表单成功验证并保存到数据库中。另外,是否需要双重验证(formset
和 form
)?感谢您的见解。
views.py
from django.shortcuts import render
from .forms import modelformset_factory, AssumptionsForm
from .models import Assumptions
import pdb
model_names = ['Form1', 'Form2']
def get_assumptions(request):
if request.method == 'POST':
print('Reached post')
formset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
pdb.set_trace()
for thing in model_names:
if thing in request.POST:
print('template name in model_names')
if formset.is_valid():
for form in formset:
if form.is_valid():
print('in for loop after valid form1')
assumptions = form.save(commit='False')
assumptions.Name = thing
assumptions.save()
else:
formset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
print('reached else')
return render(request, 'assumptions.html', {'formset': formset, 'model_names': model_names})
models.py
from django.db import models
from django.forms import ModelForm
class Assumptions(models.Model):
Worst_Case = models.FloatField(null=True, blank=True, default=None)
Grey_Case = models.FloatField(null=True, blank=True, default=None)
Red_Case = models.FloatField(null=True, blank=True, default=None)
Blue_Case = models.FloatField(null=True, blank=True, default=None)
Green_Case = models.FloatField(null=True, blank=True, default=None)
Best_Case = models.FloatField(null=True, blank=True, default=None)
Name = models.TextField(null=True, blank=True, default=None)
assumptions.html
<div class="form">
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors.as_ul }}
{% for vardas in model_names %}
<h1>{{vardas}}</h1>
<table id="formset" class="form">
{% for form in formset.forms %}
{% if forloop.first %}
<thead><tr>
{% for field in form.visible_fields %}
<th>{{ field.label|capfirst }}</th>
{% endfor %}
</tr></thead>
{% endif %}
<tr class="{% cycle 'row1' 'row2' %}">
{% for field in form.visible_fields %}
<td>
{# Include the hidden fields in the form #}
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<input type="hidden" name="{{vardas}}" />
{% endfor %}
<input type="submit" value="Next">
</form>
</div>
forms.py
from django import forms
from django.forms import modelformset_factory, ModelForm
from .models import Assumptions
class AssumptionsForm(ModelForm):
class Meta:
model = Assumptions
fields = ['Worst_Case', 'Grey_Case', 'Red_Case', 'Blue_Case', 'Green_Case', 'Best_Case']
exclude = ['Name']
您还没有实例化您的表单集。工厂是 returns 一个 class,所以这里 modelformset_factory
returns 一个表单集 class 然后你需要在你的 get 和 [=19] 中实例化=]块。
def get_assumptions(request):
AssumptionsFormset = modelformset_factory(
Assumptions, form=AssumptionsForm, extra=5)
if request.method == 'POST':
formset = AssumptionsFormset(request.POST)
if formset.is_valid():
...
else:
formset = AssumptionsFormset()
return render(request, 'assumptions.html', {'formset': formset, 'model_names': model_names})
另请注意,您不需要在每张表格上检查 is_valid()
;如果表单集有效,则所有表单都有效。