中間モデルを使用する 2 つのモデル間に M2M 関係があります。説明のために、マニュアルの例を使用しましょう。
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
CRUD 処理ビューの作成を避けるために、Django のクラスベースのビューを利用したいと思います。ただし、デフォルトの CreateView を使用しようとすると、機能しません。
class GroupCreate(CreateView):
model=Group
これにより、Group オブジェクトのすべてのフィールドを含むフォームがレンダリングされ、メンバー フィールドの複数選択ボックスが提供されます。これは、単純な M2M 関係に適しています。ただし、date_joined または invoke_reason を指定する方法はなく、フォームを送信すると次の AttributeError が返されます。
「中間モデルを指定する ManyToManyField に値を設定できません。代わりにメンバーシップのマネージャーを使用してください。」
一般的な CreateView の一部をオーバーライドする、または独自のカスタム ビューを作成して mixin でこれを行うためのきちんとした方法はありますか? Admin インターフェイスはインラインを使用して中間体との M2M 関係を原子的に処理するため、これはフレームワークの一部であるべきだと思われます。