Джанго условный выбор - PullRequest
       4

Джанго условный выбор

0 голосов
/ 22 октября 2019

Я новичок в 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)

1 Ответ

0 голосов
/ 23 октября 2019

Я бы переосмыслил модели, чтобы форма была динамичной и основывалась на запросе. Что-то вроде этого. Это дает дополнительный бонус, заключающийся в том, что нет необходимости добавлять больше логических значений для новых значков.

class Icon(models.Model):
    code = models.CharField(max_length=16)
    name = models.CharField(max_length=16)


class Profile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    icons_unlocked = models.ManyToManyField(Icon)
    icon = mdoels.ForeignKey(Icon)

Затем в своей форме вы можете установить варианты набора запросов для поля в зависимости от того, что доступно пользователю.


class IconSelectForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['icon'].queryset = self.instance.icons_unlocked.all()

    class Meta:
        model = Profile
        fields = ['icon']

Если вы не хотите менять модели, вы можете сделать то же самое с вашими логическими значениями в форме

class IconSelectForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        choices = []
        if self.instance.I_CAT:
            choices.append(('cat', 'Cat'))
        self.fields['icon'].choices = choices

    class Meta:
        model = Profile
        fields = ['icon']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...