Python 如何访问forms.py(django应用程序)中clean_avatar()中的self.request.user
在Django表单上,我让我的用户上传一个头像。我在forms.py中有一个与相关的Python 如何访问forms.py(django应用程序)中clean_avatar()中的self.request.user,python,django,forms,Python,Django,Forms,在Django表单上,我让我的用户上传一个头像。我在forms.py中有一个与相关的ModelForm关联的clean_avatar方法,在上传之前,我正在对提交的avatar进行一些处理。如何在此clean_avatar方法中访问self.request.user?我试过骑在模型的\uuuuu init\uuuuu上,但失败了 对于那些感兴趣的人,我希望在clean_avatar方法中访问self.request.user,以检查现在上传的化身是否与用户在此之前提交的化身相同。这将帮助我在表单
ModelForm
关联的clean_avatar
方法,在上传之前,我正在对提交的avatar进行一些处理。如何在此clean_avatar
方法中访问self.request.user
?我试过骑在模型的\uuuuu init\uuuuu
上,但失败了
对于那些感兴趣的人,我希望在clean_avatar
方法中访问self.request.user
,以检查现在上传的化身是否与用户在此之前提交的化身相同。这将帮助我在表单被重新提交的情况下节省带宽(我已经检查过了;在我的应用程序中,重新提交会导致头像也被重新提交并重新处理)
clean_avatar方法当前看起来如下所示:
def clean_avatar(self):
image=self.cleaned_data.get("avatar")
if image:
try:
if image.size > 1000000:
return None
except:
pass
image = Image.open(image)
image = MakeThumbnail(image)
return image
else:
return None
我认为最好将其作为一个额外参数传递给表单,以便在整个表单中使用:
class FooForm(models.ModelForm):
def __init__(self, *args, **kwargs):
# you take the user out of kwargs and store it as a class attribute
self.user = kwargs.pop('user', None)
super(FooForm, self).__init__(*args, **kwargs)
def clean_avatar(self):
current_user = self.user
# use current_user
您的views.py方法:
def view(request):
foo_form = FooForm(request.POST or None, user=request.user)
这正是我一直在尝试的,但我无法理解如何在我骑过self
之后访问clean\u avatar
中的表单数据。那么我会做self.form
吗?也就是说,self.cleaned_data.get(“avatar”)
将变成self.form.cleaned_data.get(“avatar”)
?对不起,我不明白你的问题,你在你的代码中哪里覆盖了self
?对不起,让我解释一下。当前,clean_avatar中的“self”包含表单数据,我可以使用它访问self.cleaned_data.get(“avatar”)
。如果我将user
存储为self
中的class属性,那么在clean\u avatar
中,我是否仍然能够执行self.cleaned\u data.get(“avatar”)
而不会产生任何不良影响?当然,django类也是python类,没有什么比定义实例变量并在类的不同方法中使用它更常见的了。如果您不熟悉python类和实例变量,请阅读以下内容:顺便说一句,在views.py
中,我使用的是基于类的UpdateView
,形式与我在问题中提到的形式相同。因此,在我的情况下,您在回答中提到的views.py方法实际上会超越get\u form
方法,对吗?与中一样,不是return form\u class(**self.get\u form\u kwargs())
I doreturn form\u class(**self.get\u form\u kwargs(),user=self.request.user)