【问题标题】:Using setattr() to update an object instance使用 setattr() 更新对象实例
【发布时间】:2016-11-29 02:12:03
【问题描述】:

我有一个模型类,它有一个引用 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>

查看:

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!");
       })
    };
});

【问题讨论】:

    标签: javascript python django setattr


    【解决方案1】:

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

    data: {
        dh_background: dh_background,
    }
    

    data: {
        dh_background_id: dh_background,
    }
    

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

    【讨论】:

    • 谢谢,这是最简单的答案,并保留了 setattr() 对所有属性的使用。我之前尝试过使用“dh_background.id”而不是“dh_background_id”,但它没有正确更新。
    【解决方案2】:

    正如错误所说,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”是行不通的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多