如何在同一类中实现方法间变量传递?解决获取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
相关产品推荐
相关产品推荐

