我有一个从模型类定义的表单。 根据登录用户的用户组,某些字段应为只读。 我试过了' 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
答案 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 callable
将get_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