You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在同一类中实现方法间变量传递?解决获取qid的NameError问题

1. 同一个类中将变量从一个方法传递到另一个方法的常见方式

在同一个类的不同方法间传递变量,最常用的有两种思路:

  • 使用实例属性(self.xxx):这是最直接的方式,在一个方法里把变量赋值给self.变量名,其他方法就可以通过self.变量名访问到它。因为类的实例在整个生命周期中是共享的,所以这种方式能保证变量在多个方法间的可用性。
  • 通过方法返回值传递:如果变量只需要在两个方法间临时传递,可以让第一个方法返回这个变量,然后在第二个方法里调用第一个方法并接收返回值。比如:
    def method_a(self):
        var = "hello"
        return var
    
    def method_b(self):
        received_var = self.method_a()
        print(received_var)  # 输出hello
    
2. 在AnswerView中把qid从get_context_data传递到form_valid的解决方案

先看你给出的代码,其实你已经在get_context_data里把qid赋值给了self.qid,但出现NameError: name 'tmp' is not defined的报错,大概率是你在form_valid里误写了变量名(比如用了tmp而不是self.qid)。不过这里还有个容易踩的坑:FormView的POST请求流程中,get_context_data并不会被调用,如果用户直接提交表单(POST请求),那self.qid可能根本没被赋值,这时候还是会报错。

给你两个更可靠的解决方案:

方案一:直接从self.kwargs中获取(推荐)

既然qid是从URL的kwargs里来的,不管是GET还是POST请求,self.kwargs都会包含这个参数,所以你完全可以跳过get_context_data,直接在form_valid里读取:

class AnswerView(FormView):
    template_name = 'answer.html'
    form_class = AnsForm
    success_url='success'
    
    def get_context_data(self, *args, **kwargs):
        context = super(AnswerView,self).get_context_data(**kwargs)
        qid = self.kwargs['qid']
        print(qid)
        q_obj = Quest.objects.get(id=qid)
        context['question'] = q_obj
        return context
    
    def form_valid(self, form):
        # 直接从self.kwargs获取qid,无需依赖get_context_data
        qid = self.kwargs['qid']
        # 这里可以用qid做你需要的操作,比如关联答案到问题
        answer = form.save(commit=False)
        answer.question = Quest.objects.get(id=qid)
        answer.save()
        return super().form_valid(form)

方案二:封装成独立方法(更优雅)

如果多个方法都需要用到qid,可以把获取qid的逻辑封装成一个单独的方法,避免重复代码:

class AnswerView(FormView):
    template_name = 'answer.html'
    form_class = AnsForm
    success_url='success'
    
    def get_qid(self):
        # 统一的qid获取逻辑
        return self.kwargs['qid']
    
    def get_context_data(self, *args, **kwargs):
        context = super(AnswerView,self).get_context_data(**kwargs)
        qid = self.get_qid()
        print(qid)
        q_obj = Quest.objects.get(id=qid)
        context['question'] = q_obj
        return context
    
    def form_valid(self, form):
        qid = self.get_qid()
        # 后续操作...
        return super().form_valid(form)

至于你遇到的NameError,检查一下form_valid里的代码,是不是不小心把self.qid写成了tmp,或者tmp这个变量根本没被定义,修正变量名就能解决这个问题。

内容的提问来源于stack exchange,提问作者Anjitha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:56:39