【问题标题】:Django and ajax request: ValueError: Cannot assign must be a instanceDjango 和 ajax 请求:ValueError: Cannot assign must be an instance
【发布时间】:2020-09-17 05:56:29
【问题描述】:

我正在尝试在我的 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是foreingKey:

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

在这种情况下,我该如何克服这个问题?

【问题讨论】:

  • 你能分享Conto的模型吗?
  • 我已编辑问题并将其添加到Materiale 模型之后

标签: python jquery django ajax django-models


【解决方案1】:

在您的UpdateCrudUser 中,变量conto1 已被分配为一个字符串,更准确地说是:conto1 = request.GET.get('conto', None)

然后,当您实例化Materiale 模型时(通过obj 对象),您尝试将该字符串设置为其conto 字段,该字段需要Conto 模型的对象,而不是一个字符串。

如何克服这个问题?与其直接将该字符串分配给obj.conto,不如先通过其字段nome 进行查询以获取Conto 对象。在你的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 名称与任何现有对象都不匹配,这将创建一个新的Conto 对象,然后可以将其分配给@987654336 @您要更新的实例。

【讨论】:

  • @revilscano 非常感谢您的建议。我已经得到它,并且使用 Conto 我已经解决了这个错误。我已经在我的所有领域都实现了它,但是一个给我以下错误:registrazioni.models.Tipologia.MultipleObjectsReturned: get() returned more than one Tipologia -- it returned 2!
  • 你得到了这个,因为你有两个 Tipologia 对象,对于你用来进行查找的字段具有相同的值。如果没问题(有两个对象具有相同的字段值),那么使用filter() 而不是get() 来获取这些记录。
  • 好吧,如果我使用 filter() 给我以下错误:ValueError: Cannot assign "&lt;QuerySet [&lt;Tipologia: travi&gt;, &lt;Tipologia: travi&gt;]&gt;": "Materiale.tipologia" must be a "Tipologia" instance
  • 我不能透露太多关于那部分的信息,因为我没有看到那个代码,但是如果你有 Topologia 的这两个对象匹配你使用的标准,你可能想要使用附加参数来执行查询并且只有一个对象(在这种情况下,您可以使用返回 get()Topologia.objects.filter(your_param_should_be=here)[0])。
  • 谢谢你,你太棒了:) 我解决了问题
猜你喜欢
  • 2021-06-04
  • 2021-03-26
  • 2018-02-05
  • 2017-08-14
  • 2018-03-31
  • 2014-08-29
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多