У кортежа 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__
- подходящее место для этого, но если это работает...