假设我在“人”表中有两个记录:John和Matthew。
在“管理组”表单中,我希望能够为每个组添加一个人(从现有的一个人中-重要)并指定一个成员资格。我希望membership_id
,person
和group
的组合在成员资格表中是唯一的。
我尝试过TabularInline
,它看起来非常有前途,但是我发现该解决方案有些麻烦。
想象一下,我已经单击GOLD作为会员,单击John成为Person,然后单击Add another Membership
。由于约翰已经被“使用”,因此他不应该作为选择而可见,而应该是。我的意思是表单中没有遵循字段组合约束。我该如何改变?
另外,在编辑Group实例时,即使指定了memberhio,表单也会返回一条消息,指出必须填写该字段。
型号:
class MembershipEnum(Enum):
gold = 'GOLD'
silver = 'SILVER'
@classmethod
def choices(cls):
return tuple((s.name.upper(), s.value) for s in cls)
class Person(models.Model):
name = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
name = models.CharField(max_length=300, choices=MembershipEnum.choices(), blank=False, default=None)
class Meta:
unique_together = [["id", "person", "group"]]
管理模块:
class MembershipInline(TabularInline):
model = Membership
extra = 1
class GroupForm(ModelForm):
class Meta:
model = Group
exclude = []
class GroupAdmin(admin.ModelAdmin):
inlines = (MembershipInline,)
form = GroupForm
admin.site.register(Group, GroupAdmin)