【问题标题】:Django passing form_valid inline formset context to get_context_data()Django 将 form_valid 内联表单集上下文传递给 get_context_data()
【发布时间】:2020-11-05 04:08:59
【问题描述】:

我有一个包含多个嵌套内联表单集的表单。我正在验证 form_valid 中的内联表单集,这些错误会添加到有错误的表单中。

一旦 form_invalid 触发,它就会返回->

return self.render_to_response(
            self.get_context_data(form=form,
                                  note=note,
                                  enrollment=enrollment,
                                  mealCount=mealCount))

其中note、enrollment 和mealCount 都是内联表单集。

get_context_data,覆盖 form_valid 方法中保存的任何上下文。

如何将 form_valid 中的上下文传递到 get_context_data,以便可以使用正确的上下文(如果可用)或空白实例来实例化表单集(如果在 form_valid 中未创建上下文)?

def get_context_data(self, **kwargs):
    context = super(RoomCreateView, self).get_context_data(**kwargs)
    #post data was passed in form valid!
    if self.request.POST:
        context['enrollment'] = kwargs['enrollment']
        context['note'] = kwargs['note']
        context['mealCount'] = kwargs['mealCount']
    return context

上面,kwargs['formsetname'] 给出了 'NoneType' 对象没有属性 '_state'。尽管存在对象,但没有 inlineformset 的实例。

发生错误时,这是​​堆栈中的对象:

【问题讨论】:

    标签: django formset inline-formset


    【解决方案1】:

    对于任何偶然发现此问题的人:

    修复方法是捕获错误并将它们添加到创建/更新等时的获取上下文中。通过这样做,我能够避免为每个内联表单集创建 CBV。捕获父Form Valid中设置的错误并将它们添加到内联formset的未保存实例中,使用以下代码:

        def get_context_data(self, **kwargs):
        context = super(*CBVNAME*, self).get_context_data(**kwargs)
        enrollmentErrors = kwargs['enrollment'].errors
        noteErrors = kwargs['note'].errors
        mcErrors = kwargs['mealCount'].errors
        if self.request.POST:
            context['enrollment'] = enrollmentFormSet(self.request.POST, instance = self.get_object())
            context['note'] = roomNoteFormSet(self.request.POST, instance = self.get_object())
            context['mealCount'] =roomUniqueMealCountFormSet(self.request.POST, instance = self.get_object())
            if enrollmentErrors:
                for num, form in enumerate(context['enrollment'].forms):
                    for key in enrollmentErrors[num]:
                        field= None
                        if(key != '__all__'):
                            field = key
                        msg = enrollmentErrors[num][key].as_text()
                        form.add_error(field, msg)
    
            if noteErrors:
                for num, form in enumerate(context['note'].forms):
                    for key in noteErrors[num]:
                        field= None
                        if(key != '__all__'):
                            field = key
                        msg = noteErrors[num][key].as_text()
                        form.add_error(field, msg)
            if mcErrors:
                for num, form in enumerate(context['mealCount'].forms):
                    for key in mcErrors[num]:
                        field= None
                        if(key != '__all__'):
                            field = key
                        msg = mcErrors[num][key].as_text()
                        form.add_error(field, msg)
        else:
            context['enrollment'] = enrollmentFormSet(instance = self.get_object())
            context['note'] = roomNoteFormSet(instance = self.get_object())
            context['mealCount'] = roomUniqueMealCountFormSet(instance=self.get_object()) 
    
        return context
    

    【讨论】:

      猜你喜欢
      • 2011-11-10
      • 1970-01-01
      • 2013-11-20
      • 2015-08-27
      • 1970-01-01
      • 2014-03-19
      • 2012-07-24
      • 1970-01-01
      • 2021-06-28
      相关资源
      最近更新 更多