M2M与中间模型关系的基于类的视图

Sym*_*ric 5 django many-to-many

我在两个使用中间模型的模型之间建立了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)
Run Code Online (Sandbox Code Playgroud)

我想使用Django的基于类的视图,以避免编写CRUD处理视图.但是,如果我尝试使用默认的CreateView,它不起作用:

class GroupCreate(CreateView):
    model=Group
Run Code Online (Sandbox Code Playgroud)

这将呈现一个包含Group对象上所有字段的表单,并为members字段提供一个多选框,这对于简单的M2M关系是正确的.但是,无法指定date_joined或invite_reason,并且提交表单会给出以下AttributeError:

"无法在指定中间模型的ManyToManyField上设置值.请改用Membership的管理器."

是否有一种巧妙的方法来覆盖通用CreateView的一部分,或者使用mixins组合我自己的自定义视图来执行此操作?感觉这应该是框架的一部分,因为Admin界面使用内联自动处理与中间体的M2M关系.

ecd*_*ani 6

你必须扩展CreateView:

from django.views.generic import CreateView

class GroupCreate(CreateView):
    model=Group
Run Code Online (Sandbox Code Playgroud)

并覆盖form_valid():

from django.views.generic.edit import ModelFormMixin
from django.views.generic import CreateView

class GroupCreate(CreateView):
    model = Group

    def form_valid(self, form):
        self.object = form.save(commit=False)
        for person in form.cleaned_data['members']:
            membership = Membership()
            membership.group = self.object
            membership.person = person
            membership.save()
        return super(ModelFormMixin, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

正如文档所说,你必须membershipgroup和之间的每个关系创建新的person.

我在form_valid这里看到了覆盖: 在具有中间模型的mtm上使用基于类的UpdateView