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关系.
你必须扩展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)
正如文档所说,你必须membership为group和之间的每个关系创建新的person.
我在form_valid这里看到了覆盖:
在具有中间模型的mtm上使用基于类的UpdateView
| 归档时间: |
|
| 查看次数: |
4348 次 |
| 最近记录: |