TypeError:Reporter类型的对象不可JSON序列化

时间:2020-06-21 14:18:58

标签: json django ajax django-views

我正在尝试为记者添加ajax,但无法正常工作。当我使用{'reporter':reporter.name}发送json数据时,它会成功在数据库中创建obj,但无法在select选项中显示此新创建的obj。我必须刷新才能在选择选项中看到该对象。然后,我尝试通过使用json.dumps(obj)转储来将对象实例作为JsonResponse发送,但出现此错误可序列化错误。

我必须创建报告程序对象并在选择选项中显示而不刷新页面。我该怎么做 ?我的方法有什么问题吗?

视图

class AddReporterView(View):
    def post(self, request):
        name = request.POST.get('name')
        reporter = Reporter.objects.create(name=name)
        data = {
            'reporter': json.dumps(reporter)
        }
        return JsonResponse(data)

脚本

$(document).on('submit','#target-category-form',function(e) {
        e.preventDefault();
        var form = $(this);
        $.ajax({
            url: form.attr("action"),
            data: {
                name:$('#name').val(),
                csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val(),
            },
            type: 'POST',
            dataType:'json',
            success: handleFormSuccess,

        });
    });
    function handleFormSuccess(data){
              $("#id-categories").html(data);
              $('#modalOpen').modal('toggle');
               console.log(data);
                }

我想在此html select元素中显示创建的数据

<select class="form-control" name="reporter" multiple="multiple" id="id-categories">

                        {% for reporter in reporters %}
                        <option value="{{reporter.pk}}">{{reporter.name}}</option>
                        {% endfor %}

                    </select>

1 个答案:

答案 0 :(得分:1)

要将实例转换为字典,可以使用j + 1

model_to_dict

默认情况下,序列化是在from django.forms.models import model_to_dict reporter = Reporter.objects.first() data = {'reporter': model_to_dict(reporter)} 中使用JsonResponse隐式完成的,因此您无需理会

json.dumps

编辑

# glimpse of source code.
class JsonResponse(HttpResponse):
    def __init__(self, data, encoder=DjangoJSONEncoder, **kwargs):
        ...
        data = json.dumps(data, cls=encoder, **json_dumps_params)
        super().__init__(content=data, **kwargs)