Django实现点击按钮将is_tutorial设为True存库并跳转欢迎页
教程完成标记与自动跳过的实现步骤
核心逻辑
点击continue时不直接跳转欢迎页,先经过专用视图更新当前用户的Tutorial完成状态,再重定向到欢迎页;访问教程页时提前判断完成状态,已完成的用户直接跳走,不再渲染教程内容。
具体操作
新增专用的状态更新视图
用login_required装饰器限制只有登录用户能访问,避免未登录触发报错。视图内通过ORM匹配当前用户的Tutorial记录,将is_tutorial字段更新为True,更新完成后直接重定向到欢迎页。
参考视图代码:from django.contrib.auth.decorators import login_required from django.shortcuts import redirect from .models import Tutorial @login_required def mark_tutorial_completed(request): # 拦截非POST请求,避免GET触发的非法状态变更 if request.method != "POST": return redirect("tutorial_page") # 兼容用户无对应Tutorial记录的场景,不存在记录则自动创建 Tutorial.objects.update_or_create( user=request.user, defaults={"is_tutorial": True} ) # 替换为项目内欢迎页的路由名称 return redirect("welcome_page")配置对应路由
在项目的urls.py中为上述视图注册路径,方便模板反向解析:from django.urls import path from . import views urlpatterns = [ # 原有tutorial-page路由保持不变 path("tutorial-page/", views.tutorial_page, name="tutorial_page"), # 新增教程完成的处理路由 path("tutorial/complete/", views.mark_tutorial_completed, name="mark_tutorial_completed"), ]修改教程页的continue控件
移除原来直接指向欢迎页的硬编码超链接,替换为指向新增的完成处理路由,用带CSRF校验的POST表单替代裸a标签,避免爬虫误触发:<form action="{% url 'mark_tutorial_completed' %}" method="post"> {% csrf_token %} <button type="submit">Continue</button> </form>改造原有tutorial_page视图实现自动跳过
进入教程页时先查询当前用户的Tutorial完成状态,若is_tutorial为True则直接重定向到欢迎页,不再渲染教程模板:def tutorial_page(request): # 登录用户直接查询完成状态,已完成的直接跳转 if request.user.is_authenticated: tutorial_record = Tutorial.objects.filter(user=request.user).first() if tutorial_record and tutorial_record.is_tutorial: return redirect("welcome_page") # 未完成的正常渲染教程页 return render(request, "tutorial.html")
注意事项
- 不要将字段更新逻辑直接写在
tutorial_page视图内,否则用户每次打开教程页都会自动把状态改成完成,失去点击continue才标记完成的触发逻辑 - 优先使用ORM的
update_or_create方法处理可能存在的用户无对应Tutorial记录的边界场景,避免查询时抛出空记录的异常 - 优先用POST请求处理状态更新操作,避免被搜索引擎爬虫误访问GET链接触发状态变更,破坏用户的教程引导流程
- 路由配置全部用路由名称做反向解析,不要写硬编码的路径,后续改路径时不用批量修改模板和视图代码
内容的提问来源于stack exchange,提问作者sugnez
相关产品推荐
相关产品推荐

