2016-11-29 8 views
1

django DB 객체를 참조하는 특성을 가진 모델 클래스가 있습니다. 이 속성을 변경하려면이 속성의 속성을 변경하는 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)) 
,

자바 스크립트 : 당신은 POST 변수에 개체 ID를 전달하는

//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

가 아닌 실제 객체 자체 (어쨌든 그것을 할 수 없습니다). 어느

data: { 
    dh_background_id: dh_background, 
} 

에 다음과 같은 부분

data: { 
    dh_background: 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"은 작동하지 않습니다.