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

如何在Django中每日早晨展示用户专属推荐并解决即时显示问题

解决思路

核心要解决两个问题:限制每日仅展示一次推荐,以及用户主动查看后再删除推荐,避免刷新页面重复触发。下面分步骤实现:

1. 记录用户的推荐查看状态

首先需要追踪用户是否在今日已经查看过推荐,有两种方案可选:

方案A:修改User模型(持久化记录,更可靠)

在你的models.py中扩展默认User模型,添加记录最后查看日期的字段:

from django.contrib.auth.models import AbstractUser
from django.db import models
from datetime import date

class CustomUser(AbstractUser):
    last_recommendation_viewed = models.DateField(null=True, blank=True, help_text="记录用户最后查看推荐的日期")

然后执行数据库迁移命令:

python manage.py makemigrations
python manage.py migrate

记得在settings.py中配置AUTH_USER_MODEL = 'yourapp.CustomUser'(替换yourapp为你的应用名)。

方案B:使用Session(无需修改数据库,快速实现)

如果不想修改User模型,可以用Session临时存储用户的查看日期,缺点是Session过期或清除后用户可能重复看到推荐。

2. 编写视图逻辑

添加@login_required确保只有登录用户能访问,然后处理用户的查看请求:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Recommendation
from datetime import date

@login_required
def dashboard(request):
    show_recommendation = False
    recommendations = []
    message = ""
    today = date.today()

    if request.method == 'POST':
        # 检查用户今日是否已查看过推荐
        # 方案A:用User模型字段
        has_viewed_today = (request.user.last_recommendation_viewed == today)
        # 方案B:用Session
        # has_viewed_today = (request.session.get('last_recommendation_viewed') == str(today))

        if not has_viewed_today:
            # 获取当前用户的专属推荐
            recommendations = Recommendation.objects.filter(user=request.user)
            # 删除已查看的推荐
            recommendations.delete()
            # 更新查看状态
            # 方案A
            request.user.last_recommendation_viewed = today
            request.user.save()
            # 方案B
            # request.session['last_recommendation_viewed'] = str(today)
            
            show_recommendation = True
        else:
            message = "您今天已经查看过推荐啦,明天再来吧!"

    return render(request, 'your_template.html', {
        'recommendations': recommendations,
        'show_recommendation': show_recommendation,
        'message': message,
        'today': today
    })

3. 修改HTML模板

让用户主动点击按钮触发查看,而不是页面加载直接显示推荐:

<li class="word-bot-sent"><p>Do you want some recommendations today? </p></li>

<!-- 仅当今日未查看时显示查看按钮 -->
{% if request.user.last_recommendation_viewed != today %}
<!-- 方案B替换为:{% if request.session.last_recommendation_viewed != today|stringformat:"Y-m-d" %} -->
    <form method="POST">
        {% csrf_token %}
        <button type="submit" style="padding: 8px 16px; cursor: pointer;">查看今日推荐</button>
    </form>
{% endif %}

<!-- 显示提示消息 -->
{% if message %}
    <li class="word-bot-sent"><p>{{ message }}</p></li>
{% endif %}

<!-- 展示已查看的推荐内容 -->
{% if show_recommendation %}
    {% for obj in recommendations %}
        <li class="word-bot-sent"><p>{{ obj.title }}</p></li>
        <li class="word-bot-sent"><p>{{ obj.text }}</p></li>
    {% empty %}
        <li class="word-bot-sent"><p>今天没有专属推荐哦~</p></li>
    {% endfor %}
{% endif %}

关键说明

  • 避免刷新重复展示:通过记录用户的查看日期,确保每日仅能触发一次推荐展示和删除逻辑。
  • 用户主动触发:只有用户点击"查看今日推荐"按钮后,才会获取并删除推荐,避免页面加载/刷新时自动执行操作。
  • CSRF保护:表单中必须包含{% csrf_token %},否则Django会拦截POST请求。

内容的提问来源于stack exchange,提问作者so96

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:42:45