Допустим, у меня есть две записи в таблице Person: Джон и Мэтью.
В форме группы администраторов для каждой группы я хотел бы иметь возможность добавить одного человека (из существующих - ВАЖНО) и указать членство. Я хочу, чтобы комбинация membership_id
, person
и group
была уникальной в таблице членов.
Я пробовал TabularInline
, и это выглядит очень многообещающе, но я нашел некоторые проблемы с решением.
Представьте, что я нажал GOLD для членства, John for Person, а затем Add another Membership
. Поскольку Джон уже «использовался», он не должен быть виден как вариант, но он есть. Я имею в виду ограничение комбинации полей не соблюдается в форме Как я могу это изменить?
Кроме того, при редактировании экземпляра группы, даже если задано membershio, формы возвращают сообщение о том, что поле является обязательным.
Модель:
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)