如何在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
相关产品推荐
相关产品推荐

