如何用Django模板语法判断登录用户是否已解决对应问题
判断登录用户是否已解决当前问题的Django实现方案
嘿,我来帮你搞定这个需求!在Django的DetailView详情页里判断用户是否解决了当前问题,有几种简洁靠谱的方式,我给你一步步拆解:
方法一:在DetailView中预处理状态(推荐)
这种方式逻辑清晰,把数据处理放在视图层,模板只负责展示,是Django的最佳实践之一。
你只需要重写DetailView的get_context_data方法,在里面检查当前登录用户和当前问题的关联记录是否存在:
# problems/views.py from django.views.generic import DetailView from .models import Problem from solve_activities.models import SolveActivity class ProblemDetailView(DetailView): model = Problem template_name = 'problems/problem_detail.html' def get_context_data(self, **kwargs): # 先获取默认的上下文数据 context = super().get_context_data(**kwargs) current_problem = self.get_object() user = self.request.user # 检查用户是否已登录,再判断是否存在解决记录 if user.is_authenticated: context['is_solved'] = SolveActivity.objects.filter( user=user, problem=current_problem ).exists() else: context['is_solved'] = False return context
然后在模板里直接使用这个提前计算好的变量:
<!-- problems/problem_detail.html --> {% if user.is_authenticated %} {% if is_solved %} <div class="alert alert-success">你已经解决过这个问题啦!🎉</div> {% else %} <div class="alert alert-info">还没挑战过这个问题?快去试试吧!💪</div> {% endif %} {% else %} <div class="alert alert-warning">请先登录,查看你的解决状态</div> {% endif %}
方法二:自定义模板过滤器(适合不想修改视图的场景)
如果更倾向于在模板层直接处理逻辑,可以写一个自定义模板过滤器,把判断逻辑封装起来。
步骤1:创建模板标签文件
在你的solve_activities应用下创建templatetags目录(记得加__init__.py空文件),然后新建solve_tags.py:
# solve_activities/templatetags/solve_tags.py from django import template from solve_activities.models import SolveActivity register = template.Library() @register.filter(name='is_solved') def is_solved(problem, user): """判断指定用户是否已解决指定问题""" if not user.is_authenticated: return False return SolveActivity.objects.filter(user=user, problem=problem).exists()
步骤2:在模板中使用过滤器
先在模板顶部加载自定义标签,然后直接调用过滤器:
<!-- problems/problem_detail.html --> {% load solve_tags %} {% if user.is_authenticated %} {% if problem|is_solved:user %} <p>你已经解决过这个问题啦!</p> {% else %} <p>还没解决这个问题,快去试试吧!</p> {% endif %} {% else %} <p>请登录后查看解决状态</p> {% endif %}
注意:要确保
solve_activities应用已经添加到settings.py的INSTALLED_APPS里,否则Django找不到你的自定义模板标签。
两种方法都能满足需求,第一种更符合MVC的分层思想,第二种则更灵活,你可以根据自己的项目习惯选择~
内容的提问来源于stack exchange,提问作者Mahmud Sajjad Abeer
相关产品推荐
相关产品推荐

