在我的ModelForm实现中,我想根据当前用户是否是超级用户执行不同类型的验证检查。如何访问当前请求用户?
答案 0 :(得分:16)
注意:如果您正在使用基于类的视图(CBV),那么在表单构造函数中传递额外的参数(例如在<D>this is the sample</D>
)或get_forms_class
中将不起作用,因为{{1}将会出现。
CBV的解决方案是使用form_class
,例如:
views.py:
<form> object is not callable
forms.py:
get_form_kwargs
答案 1 :(得分:15)
您可以在表单构造函数中将用户对象作为额外参数传递。
e.g。
f = MyForm(user=request.user)
,构造函数如下:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user',None)
super(MyForm, self).__init__(*args, **kwargs)
然后根据需要在clean_XX表单中使用用户
答案 2 :(得分:2)
我的小伙伴
我有一个要求,其中表格的模型选择字段之一取决于request.user
,并且花了一些时间。
想法是
您需要在模型表单类
__init__
方法
,然后从request
方法的参数
__init__
或其他参数
queryset
代码示例
class CsvUploadForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super(CsvUploadForm, self).__init__(*args, **kwargs)
self.fields['lists'].queryset = List.objects.filter(user=user)
lists = forms.ModelChoiceField(queryset=None, widget=forms.Select, required=True)
如您所见,lists
变量取决于当前用户,可通过request
对象使用,因此我们将字段queryset
设置为null,并将其设置为null。稍后从构造函数动态分配。
看看上面代码中的语句顺序
您可以从视图文件中传递这样的用户变量
form = CsvUploadForm(user=request.user)
或与其他POST,FILE数据类似,如下所示
form = CsvUploadForm(request.POST, request.FILES, user=request.user)
答案 3 :(得分:0)
您可以使用实例本身的实例属性来引用用户对象。
Ex; self.instance.user
class StatusForm(ModelForm):
# def __init__(self, *args, **kwargs):
# self.user = kwargs.pop('user', None)
# super(StatusForm, self).__init__(*args, **kwargs)
class Meta:
model = Status
fields = [
'user',
'content',
'image'
]
def clean_content(self):
content = self.cleaned_data.get("content", None)
if len(content) > 240:
raise ValidationError(f"Hey {self.instance.user.username}, the content is too long")
return content