FormView - 如何在方法之外使用self.request

时间:2016-06-16 05:54:22

标签: 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)

当我这样做时,我得到了这个:

  

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_qr

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']
            self.Prospect_qr = PROSPECT.objects.filter(id=idProspect_ses).values('id', 'email', 'pwd')

            context['email'] = self.Prospect_qr[0]['email']
            return context

    def form_valid(self, form):
            formData = form.clean()
            pwd_f = formData.get("password")

            if pwd_f == self.Prospect_qr[0]['pwd']:
                print "password correct"
            else:
                print "wrong password"

2 个答案:

答案 0 :(得分:0)

其实你做不到。为什么要在视图初始化时填充record_qr而不是在您想要使用它的位置?例如,如果我想在提交表单后使用record_qr,我会在form_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()

答案 1 :(得分:-1)

与实例对象变量相比,您定义了类对象变量(静态)。 See this question and answers。另请参阅python docs

你可能想要使用实例变量,你通常在类构造函数

上定义它们
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)