Я новичок в Django и работаю над проектом, в котором я пытаюсь, чтобы поля выбора зависели от значений bool, привязанных к текущему пользователю. У меня есть это в модели
user = models.OneToOneField(user_model, on_delete=models.CASCADE)
####
I_CAT = models.BooleanField(default=False)
I_DOG = models.BooleanField(default=False)
I_PAW = models.BooleanField(default=False)
I_OPTIONS = [
[('star'), ('Star')],
When(I_CAT=True, then=Value([('cat'), ('Cat')])),
]
icon = models.TextField(choices=I_OPTIONS, default='star')
Я хочу иметь его, чтобы, когда значение I_CAT для текущего пользователя установлено в True, он добавит эту опцию в наш список выбора, который используется в качестве списка выборадля значка. Я действительно не знаю лучший способ подойти к этому. Я пытался использовать операторы «Когда и если» в самом файле модели, а также в представлениях для этой страницы. Мне не удалось заставить что-либо работать, но самое близкое, что я получил, это
if I_CAT:
I_OPTIONS.append([('cat'), ('Cat')])
. Это успешно добавляет что-то в список опций, но на самом деле не проверяет, является ли I_CAT истинным или нет, и простодобавляет это каждый раз, несмотря ни на что. Я также прочитал в другом посте, что если утверждения внутри модели - плохая идея, так что идите. Любое руководство будет оценено!
РЕДАКТИРОВАТЬ: я добавил этот код в форму, как предложил Бробин. Мне пришлось добавить дополнительный оператор if, чтобы предотвратить повторное добавление параметра при каждом обновлении страницы. Теперь все работает как задумано!
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
cat = [('cat'), ('Cat')]
dog = [('dog'), ('Dog')]
paw = [('paw'), ('Paw')]
choices = [
[('star'), ('Star')],
]
if self.instance.I_CAT:
if cat not in choices:
choices.append(cat)
if self.instance.I_DOG:
if dog not in choices:
choices.append(dog)
if self.instance.I_PAW:
if paw not in choices:
choices.append(paw)
self.fields['icon'].choices = choices
icon = forms.ChoiceField(required=True)