У кортежа django нет атрибута get

Я пытаюсь ограничить выпадающие опции в зависимости от типа пользователя в одной форме, т.е. пользователь типа a имеет определенные выпадающие опции, а пользователь типа b имеет определенные выпадающие опции. Я попытался написать свою логику как показано ниже, но получаю ошибку, так как кортеж не имеет атрибута get

forms.py

class EditForm(forms.ModelForm):
    class Meta:
        model = Model
        fields = ('title', 'info','status')



    def __init__(self, *args,  **kwargs):
        self.user = kwargs.pop('user')
        super().__init__(args,  **kwargs)
       

        if self.user.is_usertypeA == True:
            self.fields['status'].choices = (
                ('C','C'),
            )
        else:
            self.fields['status'].choices = (
                ('A','A'),
                ('b','b'),
            )

models.py

class EditView(LoginRequiredMixin,UpdateView):
    template_name = 'edit.html'
    model = model
    form_class = EditForm
    context_object_name = ''
    success_url = reverse_lazy('')



    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs



    def form_valid(self,form):
        

[![Error looks as this][1]][1]
        

отслеживание ошибки

Думаю, вам нужно переопределить все поле.

https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#overriding-the-default-fields

Установите одну из опций (наиболее распространенную) по умолчанию на форме - добавьте этот код в список полей (т.е. выше Meta)

    status = forms.Select(
        widget=forms.Select(choices=CHOICES_OPTIONS_1),
    )

Затем переопределите виджет, если нужно, передав новый dict - вы можете заменить ваш текущий if .. else этим битом.

    if not self.user.is_usertypeA:
        widgets = {
            'status': Select(choices=CHOICES_OPTIONS_2),
        }

Я не проверял это, но это должно работать.

Обратите внимание, что варианты 1 и 2 предназначены для представления кортежей, которые вы указали в вопросе - поэтому первый вариант C, а второй A´ and B` в вашем примере.

Не совсем уверен, что __init__ - подходящее место для этого, но если это работает...

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