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

如何在Django应用间传递用户专属选择数据?

Django+Dash 用户选择留存方案建议

优先推荐:使用Django Model存储用户选择

这是最可靠的持久化方案,适合需要长期保存、跨会话生效的场景,完全能实现用户专属的数据隔离。

1. 创建关联用户的Model

定义一个模型来绑定用户和其选择内容:

from django.db import models
from django.contrib.auth.models import User

class UserSelection(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    selection_key = models.CharField(max_length=50)  # 标记选择来源,比如"dashboard1_dropdown"
    selection_value = models.CharField(max_length=255)  # 下拉选择的具体值
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ('user', 'selection_key')  # 确保同一用户同一选择项只有一条记录

执行迁移命令生成数据表:

python manage.py makemigrations
python manage.py migrate

2. 在第一个Dash App中保存用户选择

在下拉菜单的回调里,通过app.get_request()获取当前登录用户,然后更新或创建选择记录:

from django_plotly_dash import DjangoDash
from .models import UserSelection

app = DjangoDash('DropdownApp')

# 你的下拉菜单布局
app.layout = ...

@app.callback(
    Output('status-output', 'children'),
    Input('target-dropdown', 'value')
)
def save_user_selection(selected_value):
    request = app.get_request()
    user = request.user
    if user.is_authenticated:
        # 存在则更新,不存在则创建
        UserSelection.objects.update_or_create(
            user=user,
            selection_key='main_dropdown',
            defaults={'selection_value': selected_value}
        )
    return f"已选择:{selected_value}"

3. 在第二个Dash App中读取用户选择

同样通过请求对象获取用户,查询对应的选择记录:

from django_plotly_dash import DjangoDash
from .models import UserSelection

app2 = DjangoDash('AnotherApp')

# 第二个App的布局
app2.layout = ...

@app2.callback(
    Output('preloaded-input', 'value'),
    Input('page-load-trigger', 'n_clicks')
)
def load_user_selection(n_clicks):
    request = app2.get_request()
    user = request.user
    if user.is_authenticated:
        try:
            selection = UserSelection.objects.get(user=user, selection_key='main_dropdown')
            return selection.selection_value
        except UserSelection.DoesNotExist:
            return "请先完成选择"  # 无选择时的默认提示
    return None

其他可选方案

如果不需要长期保存选择,可根据场景选以下轻量方案:

  • Django Session:仅在当前会话生效,会话结束后数据自动清除
    保存:
    request.session['user_dropdown_choice'] = selected_value
    request.session.save()
    
    读取:
    selected_value = request.session.get('user_dropdown_choice', None)
    
  • Redis缓存:适合高并发场景,可设置过期时间
    保存:
    from django.core.cache import cache
    cache.set(f"user_{user.id}_dropdown", selected_value, timeout=86400)  # 24小时过期
    
    读取:
    selected_value = cache.get(f"user_{user.id}_dropdown")
    

关键注意点

之前的API方案失效,大概率是没正确关联当前登录用户。无论用哪种方案,核心都是在Dash回调中获取当前请求的用户对象,再针对该用户做数据的读写操作,确保数据是用户专属的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:07:08