2016-11-29 6 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)) 

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

あなたは(あなたがとにかくそれを行うことはできません)POST変数ではなく、実際のオブジェクト自体にオブジェクトIDを渡しています。どちらの

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 for each」は機能しません。

関連する問題