Django + Crispy форма - Readonly поле для определенной группы пользователей/пользователя без Javascript : возможно?
Я знаю, как установить поле readonly
с помощью помощника, но я хотел бы запретить изменение значений для определенных пользователей.
Единственный способ, который я нашел, заключается в добавлении условия в форму с учетом user.is_staf
или user.is_superuser
.
Вызов формы в файле views.py
s_form = stock_inline_formset(
instance=product, form_kwargs={'empty_sst': empty_sst, 'user_is_staff':
user.is_staff})
Условие в forms.py
class SstStockForm(forms.ModelForm):
class Meta:
model = SstStock
fields = ('qty', 'warehouse', 'maxsst', 'adresse', 'pua', 'cau')
def __init__(self, *args, **kwargs):
self.empty_sst = kwargs.pop('empty_sst', None)
self.user_is_staff = kwargs.pop('user_is_staff', None)
super().__init__(*args, **kwargs)
if not self.user_is_staff:
self.fields['qty'].widget.attrs = {'readonly': 'readonly'}
self.fields['pua'].widget.attrs = {'readonly': 'readonly'}
self.fields['cau'].widget.attrs = {'readonly': 'readonly'}
[...]
Является ли это лучшим способом?
В противном случае я мог бы сделать это с помощью JS, используя то же условие, основанное на user
для установки поля ввода readonly
.
Я не нашел ни одного ресурса, где бы говорилось об этом.
Если это работает, но вы хотите, чтобы другой набор пользователей был доступен только для чтения, почему бы просто не передать
make_readonly = # boolean derived from user
s_form = stock_inline_formset(
instance=product,
form_kwargs={'empty_sst': empty_sst, 'user_is_staff': make_readonly }
)
где make_readonly - это булево, сгенерированное в вашем представлении путем опроса request.user
или любой другой информации, полученной из данных пользователя.
Если вы хотите действовать по-разному для разных форм в наборе форм, передайте request.user
самостоятельно, а не производное от него булево, и тогда каждая форма сможет сама определять, быть ли ей доступной только для чтения или нет.