Django modelformset创建新记录,而不是更新现有记录 [英] Django modelformset creates new record instead of updating existing one
本文介绍了Django modelformset创建新记录,而不是更新现有记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
通过填写其表单并按下来添加新的方法仅首次提交作品 。如果我再做一个小的更改并再次提交,我会收到以下消息(由以下代码生成):
METHODFORMSET。错误:[{},{'name':[u'Method with this Name already exists。']}]
这是由于名称字段是唯一的,但应该具有更新,而不是创建新记录,即使我使用POST数据生成methodformset实例...
请注意,此行为仅适用于最后附加的方法实例,而不适用于表中已存在的实例。 p>
以下是相关代码,任何人都可以让我知道我在做错什么?
def sysedit(request,sys_id):
system = System.objects.get(id = sys_id)
MethodFormSet = modelformset_factory(Method,form = MethodForm)
post = None
如果request.POST:
post = request.POST.copy()
如果添加_method'in request.POST:
post ['method-TOTAL_FORMS'] = repr(int(
post ['method-TOTAL_FORMS'])+ 1)
systemform = SystemForm(data = post,instance = system)
methodformset = MethodFormSet(data = post,prefix ='method',
queryset = Method.objects.filter(id__in = system.method。 all()))
如果methodformset.is_valid():
mfs = methodformset.save()
print'SAVED-method',mfs
for mf in mfs:
如果systemform.is_valid():
sp = systemform.save(mf)
print'SYSTEM',sp
else:
print'SYSFORMSET.ERRORS :',systemform.errors
else:
print'METHODFORMSET.ERRORS:',methodformset.errors
return render_to_response('sysedit.html',
{' systemform':systemform,
'metho dformset':methodformset,
'system':system},
context_instance = RequestContext(request))
class System(models.Model):
method = models.ManyToManyField(Method)
...
类方法(models.Model):
name = models.CharField(unique = True)
...
class MethodForm(ModelForm):
class Meta:
model = Method
class SystemForm(ModelForm):
def save(self,new_method = None,commit = True,* args,** kwargs):
m = super(SystemForm,self).save(commit = False,* args,** kwargs)
if new_method:
m.method.add(new_method)
如果提交:
m.save()
返回m
类Meta:
model = System
exclude =('method')
[ Sergzach的答案]:
问题不是如何处理 Metho d这个名字已经存在
错误,但是为了防止这种情况首先发生。我认为实际的问题可能与模型处理新表单的方式有关。不管怎样,它总是试图为最后一个表单集创建一个新的实例,无论它是否已经退出。
所以如果在最后一个添加后不添加新的formset,那么modelformset会尝试重新创建最后一个formset(即使它只是在以前的提交)。
最初的情况是我在methodformset中有1个有效的Method实例和1个新的unbound实例。然后我填写表单并点击保存,这将验证两个方法并绑定第二个,然后将其保存到表中。
到目前为止一切都很好,但是如果我再次保存第二次出现错误。也许这与方法-TOTAL_FORMS = 2和method-INITIAL_FORMS = 1的事实有关。可能这是因为模型模型强制在第二种方法上创建吗?
任何人都可以确认/拒绝吗?
[周末后不要查看代码编辑]:
问题是由于我正在保存表单在视图中并保存后,我将原始的方法表单实例(从 保存)发送到模板。这个问题可以通过重新实例化
查看全文