Django视图与模板间传递UUID字符串列表时仅返回首个值问题求助
问题根因
你遇到的问题由两个错误共同导致:
- 模板中隐藏input的
value属性未加双引号包裹:你序列化后的JSON字符串包含双引号、逗号等特殊字符,浏览器解析时会将第一个空格/特殊字符前的内容识别为完整value,导致只能拿到截断后的首个UUID片段 - 取值逻辑不匹配:你将整个UUID列表序列化为单个JSON字符串存储在隐藏域,回传时是单个参数而非多个同名参数,使用
request.GET.getlist()无法正确取值
修复步骤
1. 修改模板隐藏域代码
给value属性加上双引号,同时用Django内置的escape过滤器转义特殊字符,避免HTML解析异常:
<form action='to_option_1' method='GET'> <button type='submit'>Option 1</button> {% if uuid_selects %} <input type="hidden" value="{{ uuid_selects|escape }}" name="uuid_selects"> {% endif %} </form>
2. 修改视图取值逻辑
先获取单个JSON字符串参数,再反序列化为UUID列表:
import json def to_option_1(request): option_1 = True uuid_selects = None # 取单个字符串参数而非用getlist uuid_selects_str = request.GET.get('uuid_selects') if uuid_selects_str: try: # 反序列化回列表 uuid_selects = json.loads(uuid_selects_str) except json.JSONDecodeError: uuid_selects = None return team_landing_page(request, uuid_selects = uuid_selects, option_1 = True)
可选优化
如果UUID列表过长,GET请求会有参数长度限制,你可以选择将uuid_selects存在用户session中传递,无需通过前端表单隐藏域往返:
- 存:
request.session['uuid_selects'] = uuid_selects - 取:
uuid_selects = request.session.get('uuid_selects') - 用完可以手动删除:
del request.session['uuid_selects']
内容的提问来源于stack exchange,提问作者GSam11
相关产品推荐
相关产品推荐

