简体   繁体   English

Django modelformset_factory UnboundLocalError

[英]Django modelformset_factory UnboundLocalError

I am getting error message the UnboundLocalError local variable 'Assumptions' referenced before assignment (after line else:). 我收到错误消息分配前(在其他行之后:)引用的UnboundLocalError局部变量'Assumptions'。 I wonder how is that even possible given that Assumptions is a model and is imported to the views.py. 我不知道假设Assumptions是一个模型并导入到views.py中,那怎么可能呢? Any advise how to solve it would be highly appreciated. 任何建议如何解决将不胜感激。 Also, I am trying to create multiple forms based on Assumptions modelform and save them into the database model Assumptions. 另外,我尝试基于“假设”模型窗体创建多个表单并将其保存到数据库模型“假设”中。 Please advise if this code is the correct design pattern. 请告知该代码是否是正确的设计模式。 Thank you. 谢谢。

views.py views.py

from django.shortcuts import render
from .forms import  modelformset_factory, AssumptionsForm
from .models import Assumptions


def get_assumptions(request):

    if request.method == 'POST':

        if 'name' in request.POST:      

            formset = modelformset_factory(Assumptions, form = AssumptionsForm, extra = 5)

            if formset.is_valid():

                print('valid form')            

                for form in formset:

                    print('Looping forms')

                    Assumptions =  form.save(commit='False')
                    Assumptions.Name = 'name'
                    Assumptions.save()

    else:

        formset = modelformset_factory(Assumptions, form = AssumptionsForm, extra = 5)

    return render(request, 'assumptions.html', {'formset': formset})

assumptions.html 假定.html

<div class="form">
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors.as_ul }}
{% for name in ['A', 'B'] %}
<h1>var</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="submit", name='name', value="save" />
{% endfor %}



</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', 'Base', 'Best']
        exclude = ['Name']

models.py models.py

from django.db import models
from django.forms import ModelForm

class Assumptions(models.Model):

    Worst = models.FloatField(null=True, blank=True, default=None)
    Base = models.FloatField(null=True, blank=True, default=None)
    Best = models.FloatField(null=True, blank=True, default=None)
    Name = models.TextField(null=True, blank=True, default=None)

You are shadowing the imported Assumptions name by assigning a new value to it here: 您正在通过在此处为其分配新值来掩盖导入的Assumptions名称:

Assumptions =  form.save(commit='False')

You should use a different name for your model instance. 您应该为模型实例使用其他名称。 The usual practice is to use a lowercase name, ie 通常的做法是使用小写名称,即

assumptions = form.save(commit='False')
assumptions.Name = 'name'
assumptions.save()

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

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