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 самостоятельно, а не производное от него булево, и тогда каждая форма сможет сама определять, быть ли ей доступной только для чтения или нет.

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