Django + Crispy 表单 - 无需 Javascript 的特定用户组/用户的只读字段:可能吗?

问题描述 投票:0回答:1

我知道如何使用帮助程序设置字段

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'}
            [...]

这是更好的方法吗? 否则,我可以使用基于

user
的相同条件使用 JS 来设置输入字段
readonly
。 我没有找到任何讨论此问题的资源。

django forms readonly django-crispy-forms
1个回答
0
投票

如果这有效,但您希望将一组不同的用户设置为只读,为什么不直接通过

make_readonly = # boolean derived from user
form_kwargs={'empty_sst': empty_sst, 'user_is_staff': make_readonly }

其中 make_readonly 是通过询问

request.user
或从用户详细信息派生的任何其他信息在您的视图中生成的布尔值。

如果您想对表单集中的不同表单采取不同的操作,请传递

request.user
本身而不是从它派生的布尔值,并且每个表单都可以自行决定是否只读。

© www.soinside.com 2019 - 2024. All rights reserved.