Javascript 使用setattr()更新对象实例

Javascript 使用setattr()更新对象实例,javascript,python,django,setattr,Javascript,Python,Django,Setattr,我有一个模型类,它有一个引用django DB对象的属性。我想使用setattr()的单个视图更改此属性,我使用该视图更改此对象的任何属性 问题是,我似乎无法通过堆栈传递对象实例。我甚至不确定是否可以使用setattr()来完成此操作。事实上,我甚至不确定问题是否与我尝试使用setattr()或其他东西有关-请让我知道 POST尝试时出错: ValueError at /dollhouseupdate/1 Cannot assign "u'Citadel'": "Dollhouse.dh_bac

我有一个模型类,它有一个引用django DB对象的属性。我想使用setattr()的单个视图更改此属性,我使用该视图更改此对象的任何属性

问题是,我似乎无法通过堆栈传递对象实例。我甚至不确定是否可以使用setattr()来完成此操作。事实上,我甚至不确定问题是否与我尝试使用setattr()或其他东西有关-请让我知道

POST尝试时出错:

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

class Dollhouse(models.Model):
    dollhouse_name = models.CharField(max_length=100)
    user = models.ForeignKey(User)
    dh_background = models.ForeignKey(Background)
    def __str__(self):
        return self.dollhouse_name
模板:

    <select id="background-select">
      <option value="null">Change Background</option>
        {% for background in background_objects %}
        <option value="{{ background }}">{{ background.bg_name }} </option>
        {% endfor %}
    </select>
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!");
       })
    };
});

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

data: {
    dh_background: dh_background,
}


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

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

data: {
    dh_background: dh_background,
}


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

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

type(u'Citadel')为背景#False
相反,您需要在视图中放置一些smarts,以便通过您拥有的任何键检索
Background
实例;然后,将
Dollhouse.dh_background
属性设置为该实例

如果名称=='background':
背景代码=post参数[名称]
background=background.objects.get(code=background\u code)
workingdollhouse.dh_background=背景

因为不同的POST参数将引用不同的字段,所以您需要知道每个POST参数引用的是什么,并以不同的方式对待它们。一个简单的“
setattr
”将不起作用。

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

type(u'Citadel')为背景#False
相反,您需要在视图中放置一些smarts,以便通过您拥有的任何键检索
Background
实例;然后,将
Dollhouse.dh_background
属性设置为该实例

如果名称=='background':
背景代码=post参数[名称]
background=background.objects.get(code=background\u code)
workingdollhouse.dh炣background=背景

因为不同的POST参数将引用不同的字段,所以您需要知道每个POST参数引用的是什么,并以不同的方式对待它们。对于每个属性,一个简单的“
setattr
”都不起作用。

谢谢,这是最简单的答案,并且保留了对所有属性使用setattr()。我以前尝试过使用“dh_background.id”而不是“dh_background_id”,但没有正确更新。谢谢,这是最简单的答案,并保留了对所有属性使用setattr()。我以前尝试过用“dh_background.id”代替“dh_background_id”,但没有正确更新。
data: {
    dh_background_id: dh_background,
}