Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Formset.u是否有效缺少1个必需的位置参数:';自我';_Python_Django_Validation_Django Forms_Formset - Fatal编程技术网

Python Django Formset.u是否有效缺少1个必需的位置参数:';自我';

Python Django Formset.u是否有效缺少1个必需的位置参数:';自我';,python,django,validation,django-forms,formset,Python,Django,Validation,Django Forms,Formset,我正在调试我的程序,我注意到在Formset.is\u valid行上,我得到了错误: missing 1 required positional argument: 'self' 请告知如何解决此问题,使formset和所有表单成功验证并保存到数据库。另外,是否需要双重验证(formset和form)呢?谢谢你的见解 视图.py from django.shortcuts import render from .forms import modelformset_factory, Assu

我正在调试我的程序,我注意到在
Formset.is\u valid
行上,我得到了错误:

missing 1 required positional argument: 'self' 
请告知如何解决此问题,使
formset
和所有表单成功验证并保存到数据库。另外,是否需要双重验证(
formset
form
)呢?谢谢你的见解

视图.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})
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)
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']
型号.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})
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)
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']
假设.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>

您尚未实例化表单集。工厂是返回一个类的东西,因此这里
modelformset\u factory
返回一个formset类,然后需要在get和post块中实例化该类

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})

另外请注意,您不需要在每个表单上检查
是否有效();如果表单集有效,则所有表单都将有效。

谢谢!它现在保存到数据库中,但只保存Form2数据,您能建议如何在不覆盖的情况下保存Form1和Form2数据吗?无论如何,我接受这个伟大的答案,并为中的覆盖数据创建新的问题