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. Эти два пакета позволяют указать, из какого состояния разрешен переход в другое состояние.