You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

根据用户组控制StockSearchForm中inventory字段的显示

解决方案

第一步:修改表单类,接收用户参数并做权限判断

你之前的问题核心是没把用户对象正确传入表单,而且代码里还有拼写错误(Admnistrator少了个i,正确是Administrator)。现在调整表单的__init__方法,先取出用户参数,再做权限判断:

class StockSearchForm(CustomForm):
    component__code__icontains = forms.CharField(label=_('component code'),
                                                 required=False)
    component__name__icontains = forms.CharField(label=_('component name'),
                                                 required=False)
    component__product__icontains = forms.ChoiceField(
        label=_('product'), required=False, choices=b_choice + PRODUCT_CHOICES)
    inventory = forms.BooleanField(label=_('to inventory'), required=False)

    def __init__(self, *args, **kwargs):
        # 从参数中取出用户对象,无参数时默认None
        self.user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)
        
        # 批量设置字段样式(简化代码)
        for field_name in ['component__code__icontains', 'component__name__icontains', 'component__product__icontains']:
            self.fields[field_name].widget.attrs['class'] = 'form-control'
        self.fields['inventory'].widget.attrs['class'] = 'btn pull-left'
        self.fields['inventory'].initial = False
        
        # 判断用户权限,处理inventory字段
        if self.user:
            allowed_groups = ["Administrator", "Purchasing"]
            if not self.user.groups.filter(name__in=allowed_groups).exists():
                del self.fields['inventory']
                # 若需保留字段但前端隐藏,替换为以下代码:
                # self.fields['inventory'].widget = forms.HiddenInput()

第二步:在视图中实例化表单时传入用户参数

不管是函数视图还是类视图,实例化表单时必须把当前请求的用户传进去:

函数视图示例:

def stock_search(request):
    if request.method == 'GET':
        # 关键:将request.user传入表单
        form = StockSearchForm(user=request.user)
        # 其他业务逻辑...
    # POST请求处理逻辑...
    return render(request, 'your_template.html', {'form': form})

类视图(如FormView)示例:

class StockSearchView(FormView):
    form_class = StockSearchForm
    template_name = 'your_template.html'
    
    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        # 把当前用户添加到表单参数中
        kwargs['user'] = self.request.user
        return kwargs

关键注意点

  1. 修正拼写错误:之前的Admnistrator少了一个字母i,这会导致权限判断永远不生效,必须修正为Administrator。
  2. 必须传递用户参数:如果不传user,表单内的self.user为None,权限判断逻辑不会执行,字段会始终显示。
  3. 字段处理方式选择:删除字段会让前端完全看不到该元素;用HiddenInput则是前端隐藏但表单提交时仍会携带字段值,根据业务需求选择即可。

内容的提问来源于stack exchange,提问作者Diego David Brescia Rosa diego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:55:37