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

