2010-07-27 68 views
2

我有一个观点如下代码:表单集创建新条目,而不是更新的

def controller_details(request, object_id): 
    controller = Controller.objects.get(pk=object_id) 
    controllerURI = controller.protocol + '://' + controller.server + '/' + controller.name 

    FilterFormSet = inlineformset_factory(Controller, Filter, extra=2) 

    if request.method == 'POST': 
     formset = FilterFormSet(request.POST, request.FILES, instance=controller) 
     if formset.is_valid(): 
      formset.save() 
     else: 
      HttpResponseRedirect('controller-details') 
    else: 
     formset = FilterFormSet(instance=controller) 

    return render_to_response('controller_details.html', {'formset':formset, 'controllerURI':controllerURI}, context_instance=RequestContext(request)) 

在我的模型中的单个控制器由多个过滤器(一对多),每个过滤器可以有另一个过滤器作为其产出的目标(自我一对多)。当我尝试更新特定过滤器的目标时,而不是更新目标值,我会得到一个新的条目。这里是模型的部分看起来像:

class Filter(Component): 
controller = models.ForeignKey(Controller) 
targetURI = models.ForeignKey('self', verbose_name='Target URI', null=True, blank=True) 
filterType = models.CharField('Type', max_length=64, choices=FILTER_TYPES,) 
firstFilter = models.BooleanField('First Filter') 

在此先感谢。

回答

1

终于搞明白了。下面的这些解决方案,可能有类似的问题:

controller = Controller.objects.get(pk=object_id) 
controllerURI = controller.protocol + '://' + controller.server + '/' + controller.name 
FilterFormSet = inlineformset_factory(Controller, Filter, extra=5) 

if request.method == 'POST': 
    formset = FilterFormSet(request.POST, request.FILES, instance=controller) 

    if formset.is_valid(): 
     instances = formset.save(commit=False) 

     for instance in instances: 
      instance.save() 

formset = FilterFormSet(instance=controller) 

return render_to_response('controller_details.html', {'formset':formset, 'controllerURI':controllerURI}, context_instance=RequestContext(request)) 
+0

我不知道这是不是一个“好”的方式做到这一点,但对于那些谁不想这两套代码进行比较,而不是只是做formset.save(),Przemek得到的实例保存(提交= False),然后保存每个实例。我现在正在为自己尝试这个。感谢您发布您的解决方案Przemek。 – KobeJohn 2011-10-26 07:13:02

相关问题