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

Django如何根据会话中用户的过滤偏好选择对应静态文件实现字符过滤

问题根因&修复方案

1. 修复index视图的逻辑顺序错误

原代码中跳转逻辑写在了session赋值的前面,导致保存用户偏好的代码永远不会执行,同时cleaned_data调用方式错误,应该用表单实例而非表单类调用。
修正后的index视图代码:

def index(request):
    if request.method != 'POST':
        # 无提交数据,生成空白表单
        form = FilterForm()
    else:
        # 处理POST提交数据
        form = FilterForm(data=request.POST)
        if form.is_valid():
            form.save()
            # 先获取偏好值保存到session,再执行跳转
            preference = form.cleaned_data['preference']
            request.session['preference'] = preference
            return HttpResponseRedirect('converter/file_upload')
    context = {'form':form}
    return render(request, "converter/index.html", context)

2. 修正过滤偏好的匹配逻辑

你在FilterPreference中定义的choices存储值是NO/F250/F500这类短标识,而不是显示用的None/First 250,原判断逻辑匹配不到对应值,始终进入else分支。
修正后的判断代码:

# 确定过滤规则
preference = request.session.get('preference', 'NO') # 默认不过滤

if preference == 'NO':
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter1.csv')
elif preference == 'F250':
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter2.csv')
elif preference == 'F500':
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter3.csv')
elif preference == 'F750':
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter4.csv')
elif preference == 'F1000':
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter5.csv')
else:
    file_path = os.path.join(settings.STATIC_ROOT, 'converter/filter1.csv') # 异常情况默认不过滤

3. 修正过滤文件的读取逻辑

原代码直接把文件路径字符串拆成了字符存入过滤集合,根本没有读取过滤文件的实际内容,需要打开文件读取所有要过滤的汉字:

# 过滤高频汉字
filter_chars = set()
# 打开过滤文件读取内容,若你的csv是每行存储一个汉字可直接用以下逻辑
with open(file_path, 'r', encoding='utf-8') as f:
    for line in f:
        char = line.strip()
        if char:
            filter_chars.add(char)

filtered = set()
for word in clean_unique:
    if word not in filter_chars:
        filtered.add(word)

可选优化

不需要把FilterPreference存到数据库,每个用户的偏好仅存在session即可,可直接删除form.save()代码,也不需要把FilterPreference定义成模型类,换成普通Form即可,减少不必要的数据库写入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 17:45:08