【问题标题】:Formset Creating New Entries Instead of UpdatingFormset 创建新条目而不是更新
【发布时间】:2010-07-27 00:45:25
【问题描述】:

我在一个视图中有以下代码:

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')

提前致谢。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案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))
    

    【讨论】:

    • 我不知道这是否是一种“好”的方法,但对于那些不想比较两组代码而不是只做formset.save()的人来说, Przemek 使用 save(commit=False) 获取实例,然后保存每个实例。我现在正在为自己尝试这个。感谢您发布您的解决方案 Przemek。
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多