根据用户组控制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
关键注意点
- 修正拼写错误:之前的
Admnistrator少了一个字母i,这会导致权限判断永远不生效,必须修正为Administrator。 - 必须传递用户参数:如果不传
user,表单内的self.user为None,权限判断逻辑不会执行,字段会始终显示。 - 字段处理方式选择:删除字段会让前端完全看不到该元素;用
HiddenInput则是前端隐藏但表单提交时仍会携带字段值,根据业务需求选择即可。
内容的提问来源于stack exchange,提问作者Diego David Brescia Rosa diego
相关产品推荐
相关产品推荐

