django检查表单中的用户组

时间:2014-07-29 15:51:29

标签: django forms usergroups

我有一个从模型类定义的表单。 根据登录用户的用户组,某些字段应为只读。 我试过了' request.user.groups.values_list'。但这不起作用,错误消息:'全球名称'请求'未定义'

class 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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您正在使用基于类的视图(CBV),那么在表单构造函数中传递额外的参数(例如在Dim myconnection As New SqlConnection("server=classified;database=classified") myconnection.Open() Dim theQuery As String = " SELECT Username, Password FROM Accounts WHERE (Username = '" & TextBox1.Text & "' ) AND (Password = '" & TextBox2.Text & "')" Dim repeatChecker As SqlCommand = New SqlCommand(theQuery, myconnection) 'mycommand.ExecuteNonQuery() Using reader As SqlDataReader = repeatChecker.ExecuteReader() If reader.HasRows Then ' User already exists While reader.Read() If reader("Password") = TextBox2.Text.ToString And reader("Username").ToString = TextBox1.Text Then MessageBox.Show("Logged in successfully as " & TextBox1.Text, "", MessageBoxButtons.OK, MessageBoxIcon.Information) Firs.Show() Me.Close() 'Clear all fields End If End While Else MessageBox.Show("Invalid username or password.", MsgBoxStyle.Critical) End If End Using myconnection.Close() )或get_forms_class中将不起作用,因为form_class将显示。

CBV的解决方案是使用<form> object is not callableget_form_kwargs对象传递给user

views.py:

MyForm

forms.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

答案 2 :(得分:0)

不,我没有使用基于类的视图: 我找到了解决方案,也适用于基于功能的视图。 可以在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