You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:48:12