Django modelformset_factory UnboundLocalError
Posted
技术标签:
【中文标题】Django 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)
【问题讨论】:
【参考方案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 的正确方法吗? 否,请参阅 ***.com/questions/4395230/… 在模板中构建列表。还要修复您的输入标签,以便name
使用循环变量,即<input name=" name " ...
,并去掉input
标签内的逗号
感谢您的建议!我按照你的建议做了,但是我的网站仍然是空的。我将新更新的项目文件推送到 git github.com/martin1007/test 非常感谢任何额外的帮助。
首先,Django 不会理解list.split
,您可能应该简单地使用过% for name in "AB" %
,其次,我建议您将此作为一个新问题发布,因为它与问题标题了。
感谢您的洞察力。按照建议做了,但是模板仍然不输出任何表格并保存到数据库。将更新的模板推送到 git。在这里重新打开新案例***.com/questions/51203547/… 任何其他建议都非常感谢以上是关于Django modelformset_factory UnboundLocalError的主要内容,如果未能解决你的问题,请参考以下文章