2016-04-15 12 views
0

私はdjangoの専門家ではありません。この質問が愚かであれば申し訳ありません。 私はdjangoで単純な登録ページを作成しようとしています。多対多の関係にいくつか問題があります。Django m2mの関係の問題

マイmodels.py

class Dog(models.Model): 
    name = models.CharField(max_length=100) 
    reg_num = models.CharField(max_length=100) 
    owner = models.ManyToManyField('Owner', db_column='owner') 

    class Meta: 
     managed = False 
     db_table = 'dog' 

    def __str__(self): 
     return self.name 


class Owner(models.Model): 
    name = models.CharField(max_length=100) 

    def __str__(self): 
     return self.name 

私はジャンゴからクラスベースのビューを使用しています:

class DogForm(ModelForm): 
    class Meta: 
     model = Controle 
     fields = ['name', 'reg_num','owner'] 

class DogMixin(object): 
    model = Dog 
    form_class = DogForm 
    template_name = 'generic_form.html' 
    success_url = reverse_lazy('dog_list') 


    def form_valid(self, form): 
     obj = form.save(commit=False) 
     obj.user = self.request.user 
     obj.save()   
     return HttpResponseRedirect(self.success_url) 


class DogCreate(DogMixin, CreateView): 
    pass 

class DogUpdate(DogMixin, UpdateView): 
    pass 

class DogDelete(DogMixin, DeleteView): 
    template_name = 'generic_delete.html' 

そして最後にhtmlファイル:

  <tbody> 
      {% for dog in object_list%} 
      <tr> 
       <td> {{dog.name}}</td> 
       <td> {{dog.reg_num}}</td> 
       <td> {{dog.owner}} 
      </tr> 
      {% endfor %} 
    </tbody> 

私は犬を作成するときインスタンス、私はボックス内の所有者を選択します。 表は「dog.owner」以外は表示されません。 私は何が欠けていますか?

答えて

1

dog.userは表示されていますが、フィールドの名前はownerです。

しかし、多対多フィールドをここでは必要としないと思います。これは、犬には多くの所有者がいることを意味し、テンプレートにdog.owner.allを繰り返し処理する必要があることを意味します。代わりに単純なForeignKeyが必要だと思います。この場合、dog.owner = self.request.userを実行して、すでに行っているように出力することができます。 dog.owner.add(self.request.user):あなたが確信している場合は

編集は、その後、あなたはリストの所有者のに現在のユーザーを追加する必要があります。そして、私が言うように、あなたのディスプレイテンプレートでは、多くの人がいるので、あなたは単に "所有者"を表示することはできません:を反復してdog.owner.allを繰り返してそれぞれの名前を表示する必要があります。

+0

私は、所有者がお父さん、お母さん、息子、daugtherになることができる家族の中で頑張っています。 – anaidalina

+0

ダニエルありがとう、とても役に立ちました – anaidalina