【问题标题】:django check user groups in formsdjango 检查表单中的用户组
【发布时间】:2014-09-21 01:53:49
【问题描述】:

我有一个从模型类定义的表单。 根据登录用户的用户组,某些字段应该是只读的。 我尝试使用“request.user.groups.values_list”。但这不起作用,错误消息:'global name 'request' is not defined'

类 gwagen1Form(forms.ModelForm):

class Meta:
    model = gwagen1
    fields = ('gwnummer', 'wk_auftrag', 'model', 'vorbesitzer', 'typ', 'verwendung',
              'kennzeichen', 'hsn_tsn', 'km_stand', 'repartur_kosten')


    localized_fields = '__all__'


# Default value for salesman
def __init__(self, *args, **kwargs):
    super(gwagen1Form, self).__init__(*args, **kwargs)
    self.fields["verk_num"].initial = benutzer.objects.get(flag_default=True)

    gr = request.user.groups.values_list('name', flat=True)
    if gr:   
        self.fields['km_stand'].widget.attrs['readonly'] = True

【问题讨论】:

    标签: django forms usergroups


    【解决方案1】:

    您是否使用基于类的视图?

    如果有,在对应的视图中添加:

    def get_form_kwargs(self):
        kwargs = super(GwagenView, self).get_form_kwargs()  # change to view name
    
        return dict(kwargs, groups=self.request.user.groups.values_list('name', flat=True))
    

    然后将表单的init更改为:

    def __init__(self, groups, *args, **kwargs):
        super(gwagen1Form, self).__init__(*args, **kwargs)
        self.fields["verk_num"].initial = benutzer.objects.get(flag_default=True)
    
        if groups:   
            self.fields['km_stand'].widget.attrs['readonly'] = True
    

    【讨论】:

    • 不,我没有使用基于类的视图。 views.py 中的函数开头为:def new(request):
    【解决方案2】:

    不,我没有使用基于类的视图: 我找到了解决方案,对基于函数的视图也有效。 用户组可以在 view.py 中检索并分配给表单:

    gr = request.user.groups.values_list('name', flat=False)
    ...
    form = gwagen1Form(gr, request.POST)
    
    if form.is_valid():
        (do something)
    else:
        form = gwagen1Form(gr)
    

    在 form.py 中,init 方法将检索用户组:

    def __init__(self, *args, **kwargs):
        super(gwagen1Form, self).__init__(*args, **kwargs)
        self.fields["verk_num"].initial = benutzer.objects.get(flag_default=True)
    
        # Rolle einlesen
        gr = Group()
        if gr:
            self.fields['km_stand'].widget.attrs['readonly'] = True
    

    【讨论】:

      【解决方案3】:

      如果您使用基于类的视图 (CBV),则在表单构造函数中(例如在 get_forms_class)或 form_class 中传递额外的参数将不起作用,因为将显示 <form> object is not callable

      CBV 的解决方案是使用get_form_kwargsuser 对象传递给MyForm

      views.py:

      form_class = MyForm
      
      # Sending user object to the form, to verify which fields to display/remove (depending on group)
      def get_form_kwargs(self):
          kwargs = super(MyView, self).get_form_kwargs()
          kwargs.update({'user': self.request.user})
          return kwargs
      

      forms.py:

      class MyForm(forms.ModelForm):
      
          def __init__(self, *args, **kwargs):
              self.user = kwargs.pop('user')  # To get request.user. Do not use kwargs.pop('user', None) due to potential security hole
      
              super(MyForm, self).__init__(*args, **kwargs)
      
              # If the user does not belong to a certain group, remove the field
              if not self.user.groups.filter(name__iexact='mygroup').exists():
                  del self.fields['confidential']
      

      【讨论】:

        猜你喜欢
        • 2017-11-15
        • 2013-05-04
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 2012-06-01
        • 2013-10-22
        • 2016-12-22
        • 2014-12-27
        相关资源
        最近更新 更多