Django M2MFields 'through' 小部件
Django M2MFields 'through' widgets
是否存在可用于具有 'through' 属性的 ManyToManyFields 的 Django 小部件示例?例如,我有这些模型(从 django 文档中获取源代码):
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self): # __unicode__ on Python 2
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __str__(self): # __unicode__ on Python 2
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
显然,标准的 ModelMultipleChoiceField 在这里不起作用。我需要在添加时填充 'date_joined' 和 'invite_reason' 。哪种方法最简单?
对于一个简单的小部件来说,这有点太复杂了。我什至无法想象它会是什么样子。为此,您必须使用 inline formsets。
这应该是这样的:
from django.forms import inlineformset_factory
MembershipFormSet = inlineformset_factory(Group, Membership, fields=(
'person', 'date_joined', 'invite_reason'))
group = Group.objects.get(pk=group_id)
formset = MembershipFormSet(instance=group)
在 django.contrib.admin
中,您可以使用内联 InlineModelAdmin。
是否存在可用于具有 'through' 属性的 ManyToManyFields 的 Django 小部件示例?例如,我有这些模型(从 django 文档中获取源代码):
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self): # __unicode__ on Python 2
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __str__(self): # __unicode__ on Python 2
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
显然,标准的 ModelMultipleChoiceField 在这里不起作用。我需要在添加时填充 'date_joined' 和 'invite_reason' 。哪种方法最简单?
对于一个简单的小部件来说,这有点太复杂了。我什至无法想象它会是什么样子。为此,您必须使用 inline formsets。
这应该是这样的:
from django.forms import inlineformset_factory
MembershipFormSet = inlineformset_factory(Group, Membership, fields=(
'person', 'date_joined', 'invite_reason'))
group = Group.objects.get(pk=group_id)
formset = MembershipFormSet(instance=group)
在 django.contrib.admin
中,您可以使用内联 InlineModelAdmin。