Django models choices - разрешить только определенные переходы на интерфейсе администратора

для models.IntegerField я могу легко определить варианты с

sth = models.IntegerField(choices=(
    (1, 'sth1'),
    (2, 'sth2'),
    (3, 'sth3'),
))

. Есть ли способ ограничить переходы от одного значения к другому?

Например, если текущее значение равно '1', он может перейти только к '2', но если текущее значение равно '3', он может перейти к '1' и '2', и т.д.

Мне нужно, чтобы это ограничение действовало только на интерфейс администратора. Есть ли что-нибудь встроенное для этого?

Спасибо.

Вы можете создать подкласс ModelForm для кодирования этой логики:

STH_TRANSITIONS = {
    1: [2],
    2: [3],
    3: [1, 2]
}

class FSMModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        sth = self.fields['sth']
        trans = STH_TRANSITIONS.get(self.instance.sth)
        if trans is not None:
            sth.choices = [
                (k, v) for k, v in sth.choices
                if k == self.instance.sth or k in trans
            ]

Затем вы подключаете это к ModelAdmin этой модели:

class MyModelAdmin(ModelAdmin):
    form = FSMModelForm

Похоже, что вы хотите реализовать конечный автомат состояний. Вы можете попробовать использовать django-fsm вместе с django-fsm-admin. Эти два пакета позволяют указать, из какого состояния разрешен переход в другое состояние.

Вернуться на верх