TypeError: объект типа Reporter не сериализуемый JSON - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь добавить репортера с ajax, но он не работает должным образом. Когда я отправляю данные json с помощью {'reporter':reporter.name}, он успешно создает объект в базе данных, но я не могу отобразить этот вновь созданный объект в параметре выбора. Мне нужно обновить sh, чтобы увидеть этот объект в опции выбора. Затем я попытался отправить экземпляр объекта как JsonResponse путем сброса с помощью json.dumps(obj), но я получаю эту сериализуемую ошибку.

Мне нужно создать объект-репортер и отобразить его в опции выбора без обновления страницы sh . Как мне это сделать ? Что не так в моем подходе?

просмотр

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 class="form-control" name="reporter" multiple="multiple" id="id-categories">

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

                    </select>

1 Ответ

1 голос
/ 21 июня 2020

Чтобы преобразовать экземпляр в словарь, вы можете использовать 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)

РЕДАКТИРОВАТЬ

// add this to your success callback
// you can create option either in python or javascript.
success: function(data){ 
      // on success, dynamically append the select drop down list 
      $('#id-categories').append(`<option value =${data.reporter.id}> ${data.reporter.name}</option>`)  
}
...