Настройка промежуточной модели Django TabularInline - PullRequest
0 голосов
/ 03 июля 2019

Допустим, у меня есть две записи в таблице 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...