如何为Django类视图的get方法提供上下文数据
Django类视图传递上下文到模板的实现方法
你使用的render()方法支持传入第三个参数为上下文字典,字典的键对应模板中使用的变量名,值对应要传递的数据。修改后的代码如下:
class Dashboard(LoginRequiredMixin, View): def get(self, request): if request.user is not None and len(request.user.payment_set.all()): if request.user.is_active and request.user.payment_set.first().active: # 定义上下文字典,按需添加要传递的字段 context = { "eligible_to_review": eligible_to_review(self.request), "user": request.user, "active_payment": request.user.payment_set.first() } # 将context作为第三个参数传入render return render(request, 'main.html', context) else: return redirect('home') else: return redirect('membership')
小提示:你引入的
LoginRequiredMixin已经会自动拦截未登录用户,所以request.user is not None的判断可以省略,简化代码逻辑。
传递完成后,你可以在main.html中直接通过变量名调用对应数据,示例如下:
<!-- 直接渲染变量 --> <p>欢迎你,{{ user.username }}</p> <!-- 结合模板标签做判断 --> {% if eligible_to_review %} <a href="/review/">前往审核页面</a> {% endif %}
如果你需要在多个方法中复用上下文逻辑,也可以单独抽离上下文构造方法:
class Dashboard(LoginRequiredMixin, View): def get_context(self, request): context = {} context["eligible_to_review"] = eligible_to_review(request) context["user"] = request.user context["active_payment"] = request.user.payment_set.first() # 所有公共上下文都可以在此处统一添加 return context def get(self, request): if request.user is not None and len(request.user.payment_set.all()): if request.user.is_active and request.user.payment_set.first().active: context = self.get_context(request) return render(request, 'main.html', context) else: return redirect('home') else: return redirect('membership')
如果你后续使用TemplateView等通用类视图,直接重写内置的get_context_data()方法即可实现上下文注入,逻辑和上述抽离方法一致。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

