与中级模型的M2M关系的基于类的视图 [英] Class-based views for M2M relationship with intermediate model
问题描述
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 。$ $ $ $ $ $ $ $ $ $ $ $ $
class会员(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = DateField()
invite_reason = models.CharField(max_length = 64)
我想使用Django的基于类的视图,以避免编写CRUD处理视图。但是,如果我尝试使用默认的CreateView,它不起作用:
class GroupCreate(CreateView):
模型=组
这将呈现一个表单与Group对象上的所有字段,并给出成员字段的多选框,这对于简单的M2M关系是正确的。但是,没有办法指定date_joined或invite_reason,并提交表单给出以下AttributeError:
无法在指定中介模型的ManyToManyField上设置值。使用成员资格管理器。
有没有办法覆盖一般的CreateView的一部分,或者组合我自己的自定义视图来使用mixins?感觉这应该是框架的一部分,因为管理界面使用内联来处理与中间体的M2M关系。
你必须扩展 CreateView
:
from django.views.generic import CreateView
class GroupCreate(CreateView):
model = Group
从django.views.generic中覆盖 form_valid()
:
编辑import ModelFormMixin
from django.views.generic import CreateView
class GroupCreate(CreateView):
model = Group
def form_valid(self,form )
self.object = form.save(commit = False)
在form.cleaned_data ['members']:
membership = Membership()
membership.group = self.object
membership.person = person
membership.save()
return super(M odelFormMixin,self).form_valid(form)
由于文档说,你必须创建一个新的$($) group
和个人
之间的每个关系的c $ c>会员资格 >
我在这里看到 form_valid
覆盖:
在具有中介模型的mtm上使用基于类的UpdateView
I have a M2M relationship between two Models which uses an intermediate model. For the sake of discussion, let's use the example from the manual:
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)
I'd like to make use of Django's Class-based views, to avoid writing CRUD-handling views. However, if I try to use the default CreateView, it doesn't work:
class GroupCreate(CreateView):
model=Group
This renders a form with all of the fields on the Group object, and gives a multi-select box for the members field, which would be correct for a simple M2M relationship. However, there is no way to specify the date_joined or invite_reason, and submitting the form gives the following AttributeError:
"Cannot set values on a ManyToManyField which specifies an intermediary model. Use Membership's Manager instead."
Is there a neat way to override part of the generic CreateView, or compose my own custom view to do this with mixins? It feels like this should be part of the framework, as the Admin interface atomatically handles M2M relationships with intermediates using inlines.
You must extend CreateView
:
from django.views.generic import CreateView
class GroupCreate(CreateView):
model=Group
and override the 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)
As the documentation says, you must create new membership
s for each relation between group
and person
.
I saw the form_valid
override here:
Using class-based UpdateView on a m-t-m with an intermediary model
这篇关于与中级模型的M2M关系的基于类的视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!