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()