Django中如何在类视图间传递变量?短链服务场景求助
解决Django重定向后一次性显示新生成短链接的问题
你现在用session存储新链接的问题确实在于session会保留到过期,而我们需要的是一次性提示,Django官方提供的消息框架(messages framework)完全适配这个场景,是这类需求的标准解决方案。
步骤1:确认消息框架配置(默认已配置,可快速检查)
确保项目settings.py包含以下配置:
INSTALLED_APPS = [ # ... 其他已注册应用 'django.contrib.messages', ] MIDDLEWARE = [ # ... 其他中间件 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ] TEMPLATES = [ { # ... 其他模板配置 'OPTIONS': { 'context_processors': [ # ... 其他上下文处理器 'django.contrib.messages.context_processors.messages', ], }, }, ]
步骤2:修改LinkCreate视图的form_valid方法
替换原来的session存储逻辑,改用消息框架添加一次性提示:
from django.contrib import messages # 导入消息模块 class LinkCreate(CreateView): form_class = CreateLink template_name = "index.html" success_url = reverse_lazy('users_links') def form_valid(self, form): if self.request.user.is_authenticated: form.instance.creator = self.request.user self.link_short = generate_short_link() # 添加一次性成功消息 messages.success(self.request, f"Your new link: {self.link_short}") form.instance.link_short = self.link_short return super().form_valid(form) # 原get_context_data方法保持不变 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['object_list'] = URL.objects.all().order_by('-id')[:5] return context
步骤3:修改users_links页面的模板
替换原来的session判断代码,使用消息框架的模板标签渲染提示:
{% if messages %} {% for message in messages %} <div class="success-notice"> {{ message }} </div> {% endfor %} {% endif %}
这样用户刷新页面后,这条提示会自动消失,不会持续显示。
备选方案:URL参数传递(不推荐,仅作了解)
如果暂时不想用消息框架,也可以通过URL参数传递,但存在用户刷新页面重复显示、参数暴露在URL中的缺点:
- 修改
LinkCreate的success_url:
success_url = f"{reverse_lazy('users_links')}?new_link={self.link_short}"
- 在
users_links对应的视图中获取参数并传入上下文:
def users_links(request): # ... 原有视图逻辑 new_link = request.GET.get('new_link') return render(request, 'users_links.html', {'new_link': new_link})
- 模板中渲染:
{% if new_link %} <div>Your new link: {{ new_link }}</div> {% endif %}
但还是优先推荐消息框架,更符合Django最佳实践,逻辑也更优雅。
内容的提问来源于stack exchange,提问作者Измайлов Александр
相关产品推荐
相关产品推荐

