【问题标题】:How to make a FormSet JSON serializable?如何使 FormSet JSON 可序列化?
【发布时间】:2020-07-18 02:51:51
【问题描述】:

我正在尝试将表单集作为 JSON 数据传递,但我收到了 Object of type HabitFormFormSet is not JSON serializable

为什么会这样?

我的看法:

def modal_view(request):
    HabitFormSet = modelformset_factory(
        Habit, extra=0, form=HabitModelForm)
    formset = HabitFormSet(
        request.POST,
        queryset=Habit.objects.filter(user=request.user),
    )
    if formset.is_valid():
        formset.save()
        data = {"formset": formset}
        return JsonResponse(data)

    return HttpResponseRedirect(reverse('home'))

如果我使用字典列表,我会得到Object of type Habit is not JSON serializable

    if formset.is_valid():
        formset.save()
        formlist = list()
        for form in formset:
            formlist.append(form.cleaned_data)
        data = {"formlist": formlist}
        return JsonResponse(data)

【问题讨论】:

    标签: json django


    【解决方案1】:

    自定义类没有默认的 JSON 序列化。

    您可能想要为您的Habit 模型添加一个例如to_json()as_json()(选择一个)函数,例如

    def to_json(self):
        return {
            "id": self.id,
            "something": self.something,
        }
    

    然后,列出(新保存的)习惯:

    data = {"new_habits": [form.instance.to_json() for form in formset if form.instance.id]}
    return JsonResponse(data)
    

    【讨论】:

      【解决方案2】:

      内置的JSONEncoder 有一个序列化每个python 原始类型 的策略,但他不知道如何序列化您的自定义类型(尤其是您的自定义类的实例)。

      您可以编写自己的JSONEncoder 子类,并告诉JsonResponse 使用它

      【讨论】:

        猜你喜欢
        • 2019-11-05
        • 2011-04-15
        • 2020-04-22
        • 2013-09-04
        • 1970-01-01
        • 2018-06-30
        • 2015-04-10
        相关资源
        最近更新 更多