使用setattr()更新对象实例

2024-10-03 17:22:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个model类,它有一个引用django DB对象的属性。我想用一个带有setattr()的视图来更改这个属性,我用它来更改这个对象的任何属性。在

问题是,我似乎无法通过堆栈传递对象实例。我不确定是否可以使用setattr()来完成此操作。实际上,我甚至不确定问题是我尝试使用setattr()还是其他什么-请告诉我!在

POST尝试时出错:

ValueError at /dollhouseupdate/1
Cannot assign "u'Citadel'": "Dollhouse.dh_background" must be a "Background" instance.

型号:

^{pr2}$

模板:

    <select id="background-select">
      <option value="null">Change Background</option>
        {% for background in background_objects %}
        <option value="{{ background }}">{{ background.bg_name }} </option>
        {% endfor %}
    </select>

视图:

def dollhouseupdate(request, dollhouseid):
    if request.method == 'POST':
        workingdollhouse = Dollhouse.objects.get(id=dollhouseid)
        if request.POST.get('erase') == "true":
            workingdollhouse.delete()
            return HttpResponse("Dollhouse deleted!")
        else:
            data = (request.POST).dict()
            for key, value in data.items():
                setattr(workingdollhouse, key, value)
            workingdollhouse.save()
            return HttpResponse("Dollhouse {} saved!".format(workingdollhouse.dollhouse_name))

Javascript代码:

//change dollhouse background
$("#background-select").change(function() {
    if($("#background-select").val() != null) {
        var dollhouseid = workingDollhouse;
        var dh_background = $("#background-select").val()
        console.log("changing background to " + dh_background);
        $.ajax("http://127.0.0.1:8000/dollhouseupdate/"+dollhouseid, {
            type: 'POST',
            data: {
                dh_background: dh_background,
            }
        })
        .done(function(response){
           console.log("The request is complete!");
           console.log(response);
           window.location = "http://127.0.0.1:8000/";
       })
       .fail(function() {
           console.log("Sorry, there was a problem!");
       })
    };
});

Tags: 对象log属性valuerequestpostselectconsole
2条回答

正如错误所说,Dollhouse.dh_background属性必须是Background模型的实例。您试图将其值设置为另一个类型的对象;我认为是一个文本字符串。在

type(u'Citadel') is Background  # False

相反,您需要在视图中放入一些智能,以便使用您拥有的任何键检索Background实例;然后,将Dollhouse.dh_background属性设置为该实例。在

^{pr2}$

因为不同的POST参数将引用不同的字段,所以您需要知道每个参数所引用的内容,并对它们进行不同的处理。一个简单的“setattr”对每一个都无效。在

您传递的是POST变量中的对象id,而不是实际对象本身(无论如何都不能这样做)。或者更改以下部分

data: {
    dh_background: dh_background,
}

^{pr2}$

或者使用视图代码中的id获取对象实例。在

相关问题 更多 >