【问题标题】:Django modelformset_factory UnboundLocalErrorDjango modelformset_factory UnboundLocalError
【发布时间】:2018-12-14 13:36:22
【问题描述】:

我收到错误消息,即在赋值之前引用的 UnboundLocalError 局部变量“假设”(在 else 行之后:)。我想知道假设假设是一个模型并且被导入到views.py中,这怎么可能。任何建议如何解决它将不胜感激。另外,我正在尝试基于 Assumptions modelform 创建多个表单并将它们保存到数据库模型 Assumptions 中。请告知此代码是否是正确的设计模式。谢谢。

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

<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

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)

【问题讨论】:

    标签: python django variables local formset


    【解决方案1】:

    您正在通过在此处为其分配一个新值来隐藏导入的 Assumptions 名称:

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

    您应该为模型实例使用不同的名称。通常的做法是使用小写名称,即

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

    【讨论】:

    • 谢谢,它解决了关于无限错误的问题。但是,现在我得到空白页。这是在模板 {% for name in ['A', 'B'] %} 中执行 for 循环然后将其传递给 views.py 并分配给假设.name 的正确方法吗?
    • 否,请参阅 stackoverflow.com/questions/4395230/… 在模板中构建列表。还要修复您的输入标签,以便name 使用循环变量,即&lt;input name="{{ name }}" ...,并去掉input 标签内的逗号
    • 感谢您的建议!我按照你的建议做了,但是我的网站仍然是空的。我将新更新的项目文件推送到 git github.com/martin1007/test 非常感谢任何额外的帮助。
    • 首先,Django 不会理解list.split,您可能应该简单地使用过{% for name in "AB" %},其次,我建议您将此作为一个新问题发布,因为它与问题标题了。
    • 感谢您的洞察力。按照建议做了,但是模板仍然不输出任何表格并保存到数据库。将更新的模板推送到 git。在这里重新打开新案例stackoverflow.com/questions/51203547/… 任何其他建议都非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多