Python FormView-如何在方法之外使用self.request
可以通过以下方式实现:Python FormView-如何在方法之外使用self.request,python,django,Python,Django,可以通过以下方式实现: class Login_vw(FormView): form_class = Login_fr success_url = '/success/' template_name = 'login.html' someVar_ses = self.request.session['someVar'] record_qr = MyModel.objects.filter(id=someVar_ses) 当我这样做时,我会得到: Nam
class Login_vw(FormView):
form_class = Login_fr
success_url = '/success/'
template_name = 'login.html'
someVar_ses = self.request.session['someVar']
record_qr = MyModel.objects.filter(id=someVar_ses)
当我这样做时,我会得到:
NameError:未定义名称“self”
但是当我在像get_context_data这样的方法中使用它时,它是正确的
我需要的是在不同的方法中使用record_qr var,不要在每个方法中重复代码
有办法吗
编辑以添加此详细信息:
我想做的是这样的:
class Login_vw(FormView):
form_class = Login_fr
success_url = '/success/'
template_name = 'login.html'
def get_context_data(self, **kwargs):
context = super(Login_vw, self).get_context_data(**kwargs)
idProspect_ses = self.request.session['idProspect']
Prospect_qr = PROSPECT.objects.filter(id=idProspect_ses).values('id', 'email', 'pwd')
context['email'] = Prospect_qr[0]['email']
return context
def form_valid(self, form):
formData = form.clean()
pwd_f = formData.get("password")
if pwd_f == Prospect_qr[0]['pwd']:
print "password correct"
else:
print "wrong password"
所以,我试着用self这样做,但我得到了一个属性错误(对象没有属性Prospect\u qr)
您正在定义类对象变量(静态),而不是实例对象变量。另见 您可能希望使用的实例变量通常是在类构造函数中定义的
class Login_vw(FormView):
def __init__(self, *args, **kwargs):
FormView.__init__(self, *args, **kwargs)
form_class = Login_fr
success_url = '/success/'
template_name = 'login.html'
# the constructor of FormView will set this (hopefully)
someVar_ses = self.request.session['someVar']
record_qr = MyModel.objects.filter(id=someVar_ses)
实际上你不能那样做。为什么要在视图初始化时填充
记录\u qr
,而不是在您希望使用它的位置?例如,如果我想在表单提交后使用record\u qr
,我会使用form\u valid
方法。如果您想在多个函数中使用它,为什么不在视图中创建一个单独的函数呢。例如:
class MyForm(FormView):
record_qr = None
def get_record_qr(self):
if self.record_qr:
return self.record_qr
elif hasattr(self, 'request'):
self.record_qr = MyModel.objects.filter(id=self.request.session.get(value))
return self.record_qr
return None
然后在任何需要使用此函数的地方调用此函数,如:
def form_valid(self, form):
record_qr = self.get_record_qr()
你不能那样做,但没有必要这样做。你想用这些变量做什么?实际上我现在需要在两个方法中使用它,但也许我可以在更多的方法中使用它,但我的主要观点是保持“干燥”的概念和性能,而不是从每个方法中检查数据库。你告诉我的方式看起来更干净,但我认为每次我调用get_record_qr方法时,它仍在检查数据库。也许我可以将查询结果保存在一个变量中,然后改用该变量。你知道@DomTomCat答案有什么问题吗?我将编辑我的问题以添加更多细节,我非常感谢您的帮助!在
get\u record\u qr
方法中,将record\u qr
的值设置为self属性。检查更新的答案。很抱歉,但您的解决方案给了我以下错误:name错误:未定义全局名称“get\u record\u qr”
可能我必须在某个位置声明该方法?是在form类中声明该方法。
def form_valid(self, form):
record_qr = self.get_record_qr()