使用 setattr() 更新对象实例
Using setattr() to update an object instance
我有一个模型 class,它有一个引用 django 数据库对象的属性。我想使用带有 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>
查看:
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!");
})
};
});
您正在 POST
变量中传递对象 ID,而不是实际对象本身(无论如何您都不能这样做)。要么更改以下部分
data: {
dh_background: dh_background,
}
至
data: {
dh_background_id: dh_background,
}
或者在您的视图代码中使用 id 获取对象实例。
如错误所述,Dollhouse.dh_background
属性必须是 Background
模型的实例。您正试图将其值设置为不同类型的对象;我认为是文本字符串。
type(u'Citadel') is Background # False
相反,您需要在视图中添加一些智能,以便通过您拥有的任何键检索 Background
个实例;然后,将 Dollhouse.dh_background
属性设置为该实例。
if name == 'background':
background_code = post_args[name]
background = Background.objects.get(code=background_code)
workingdollhouse.dh_background = background
因为不同的 POST 参数将引用不同的字段,您将需要知道每个参数指的是什么并区别对待它们。一个简单的“setattr
for each one”是行不通的。
我有一个模型 class,它有一个引用 django 数据库对象的属性。我想使用带有 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>
查看:
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!");
})
};
});
您正在 POST
变量中传递对象 ID,而不是实际对象本身(无论如何您都不能这样做)。要么更改以下部分
data: {
dh_background: dh_background,
}
至
data: {
dh_background_id: dh_background,
}
或者在您的视图代码中使用 id 获取对象实例。
如错误所述,Dollhouse.dh_background
属性必须是 Background
模型的实例。您正试图将其值设置为不同类型的对象;我认为是文本字符串。
type(u'Citadel') is Background # False
相反,您需要在视图中添加一些智能,以便通过您拥有的任何键检索 Background
个实例;然后,将 Dollhouse.dh_background
属性设置为该实例。
if name == 'background':
background_code = post_args[name]
background = Background.objects.get(code=background_code)
workingdollhouse.dh_background = background
因为不同的 POST 参数将引用不同的字段,您将需要知道每个参数指的是什么并区别对待它们。一个简单的“setattr
for each one”是行不通的。