与中级模型的M2M关系的基于类的视图 [英] Class-based views for M2M relationship with intermediate model

查看:115
本文介绍了与中级模型的M2M关系的基于类的视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在两个使用中间模型的模型之间有一个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 。$ $ $ $ $ $ $ $ $ $ $ $ $

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 memberships 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆