自定义Django TabularInline中间模型

时间:2019-07-03 12:42:04

标签: django python-3.x forms django-forms

假设我在“人”表中有两个记录:John和Matthew。

在“管理组”表单中,我希望能够为每个组添加一个人(从现有的一个人中-重要)并指定一个成员资格。我希望membership_idpersongroup的组合在成员资格表中是唯一的。

我尝试过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)

0 个答案:

没有答案