Django 和 ajax 请求:ValueError:无法分配必须是一个实例



我正在尝试在我的 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.

此错误是否可能由模型引起?Becouse 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

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

在你的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对象,然后可以将其分配给要更新的Materiale实例。

相关内容

最新更新