Django и ajax запрос: ValueError: Невозможно назначить, должен быть экземпляр - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь интегрировать в свой django модальный вызов ajax, чтобы напрямую изменить значение моих данных. Другими словами, у меня есть следующие views.py

class UpdateCrudUser(View):
    def  get(self, request):
        id1 = request.GET.get('id', None)
        conto1 = request.GET.get('conto', None)

        obj = Materiale.objects.get(id=id1)
        obj.conto = conto1
        obj.save()

        element = {
                'id':obj.id,
                'conto':obj.conto}

        data = {
            'element': element}
        return JsonResponse(data)

После этого я построил перед своей таблицей следующее:

{% for element in elements %}
  <tr id="element-{{element.id}}">
  <td class="elementConto userData" name="conto">{{element.conto}}</td>
  </tr>
{% endfor %}

... И после этого модальный:

<form id="updateUser">
              <div class="modal-body">
                  <input class="form-control" id="form-id" type="hidden" name="formId"/>

                  <label for="conto">Conto</label>
                  <input class="form-control" id="form-conto" name="formConto"/>

Наконец, скрипт с вызовом ajax:

function editUser(id) {
  if (id) {
    tr_id = $("#element-" + id);
    conto = $(tr_id).find(".elementConto").text();

    $('#form-id').val(id);
    $('#form-conto').val(conto);
  }
}

$("form#updateUser").submit(function() {
    var idInput = $('input[name="formId"]').val();
    var contoInput = $('input[name="formConto"]').val();
    if (contoInput && tipologiaInput ) {
        // Create Ajax Call
        $.ajax({
            url: '{% url "crud_ajax_update" %}',
            data: {
                'id': idInput,
                'conto': contoInput,
            },
            dataType: 'json',
            success: function (data) {
                if (data.element) {
                  updateToUserTabel(data.element);
                }
            }
        });
       } else {
        alert("Vediamo se funziona.");
    }
    $('form#updateUser').trigger("reset");
    $('#myModal').modal('hide');
    return false;
});

Но если я попытаюсь изменить свои данные с помощью модального окна, django выдаст мне следующую ошибку:

ValueError: Cannot assign "'Materia Prima'": "Materiale.conto" must be a "Conto" instance.

Возможно, эта ошибка возникает из-за модели? Потому что conto - это внешний ключ:

class Materiale(models.Model):
    conto = models.ForeignKey(Conto, on_delete=models.CASCADE, null=True)

class Conto(models.Model):
    nome=models.CharField('Nome Conto', max_length=30, blank=True, default="")
    def __str__(self):
        return  self.nome

В этом случае, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 29 мая 2020

В вашем UpdateCrudUser переменная conto1 была назначена как строка, точнее, когда вы это делаете: conto1 = request.GET.get('conto', None).

Затем, когда вы создаете экземпляр модели Materiale ( через объект obj), вы пытаетесь установить эту строку в поле conto, которое ожидает объект модели Conto, а не строку.

Как это преодолеть? Вместо того, чтобы назначать эту строку напрямую obj.conto, сначала сделайте запрос, чтобы получить объект Conto по его полю nome. Что-то вроде этого в вашем UpdateCrudUser представлении:

obj = Materiale.objects.get(id=id1)
conto_obj, created = Conto.objects.get_or_create(nome=conto1)

obj.conto = conto_obj

Обратите внимание, что я использовал метод get_or_create(), потому что в случае, если пользовательский ввод для Conto name не соответствует какому-либо существующему объекту, это будет создайте новый объект Conto, который затем можно будет назначить экземпляру Materiale, который вы хотите обновить.

...