2016-11-29 107 views
1

我有一個模型類,它有一個引用django數據庫對象的屬性。我想用setattr()來改變這個屬性,使用setattr()來改變這個對象的任何屬性。使用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!"); 
     }) 
    }; 
}); 

回答

0

你傳入的對象ID在POST變量,而不是實際的對象本身(你不能這樣做也無妨)。以下任一部分

data: { 
    dh_background: dh_background, 
} 

改變

data: { 
    dh_background_id: dh_background, 
} 

或使用該ID在您的視圖代碼獲取對象實例。

+0

謝謝,這是最簡單的答案,並保留setattr()用於所有屬性。我以前曾使用「dh_background.id」而不是「dh_background_id」來嘗試此操作,但未正確更新。 – Catma

0

如錯誤所述,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爲每個」將無法正常工作。