我的问题涉及将变量从模板传递到 Django 中查看。
我知道在 URL 中和通过表单传递变量。我对第一个的问题是 url 可以被操纵,这不是我想要的。有什么办法可以防止这种情况发生吗?
现在这是我的创可贴:
<form action="/match/" method="post">
{% csrf_token %}
<input type="hidden" name="name1" value="{{ male_results }}">
<input type="hidden" name="userid1" value="{{ male_pic_userid }}">
<input type="hidden" name="name2" value="{{ female_results }}">
<input type="hidden" name="userid2" value="{{ female_pic_userid }}">
<input type="submit" value="Submit" />
</form>
有没有办法避免必须使用它?谢谢!
最佳答案
大致有 3 种方法可以保留此类信息:
Session(我对你的情况的建议)
把你想要的数据填入request.session
即可字典;它会为每个用户保留,您可以轻松访问它:
# view1
request.session['name1'] = male_results
request.session['userid1'] = male_pic_userid
# view2 (or elsewhere in view1)
male_results = request.session.get('name1')
male_pic_userid = request.session.get('userid1')
优势
- 无需对您的模板进行任何更改(除了删除您现在不需要的表单)。
- 干净的 URL
- 即使在关闭并重新打开浏览器窗口后仍然存在
- 您不必担心用户会修改甚至看到 session 数据(这样更安全)
缺点
- 与
POST
一样,页面内容由 URL 和 session 数据决定 — URL 不再是唯一的,用户无法共享依赖于 session 信息的特定页面
查询参数
类似于 /match/?name1=foo1&userid1&name2=bar&userid2=2
.您可以手动添加这些 ( <a href='/match/?name1={{ male_results }}...
) 或更改您的 POST
形式为 GET
.
优势
- 这些 URL 可以共享和添加书签;如果它是一个带有过滤选项的列表,这可能是可取的(“这是我喜欢的汽车列表”发布到 Facebook,等)
缺点
- 正如您已经注意到的,这些可以由用户自由修改
- 将这些添加到每个 URL 是一个巨大的痛苦
POST 表单(您当前的方法)
优势
- 更隐蔽一点(没有某种浏览器扩展,用户看不到任何东西)
- 稍微难以操纵(尽管不依赖于这种隐蔽的安全性)
- 更清晰的 URL
缺点
- 如果您使用浏览器的“后退”按钮,会在 Internet Explorer 上显示“此页面已过期”消息...
- ...如果用户尝试重新加载您的任何页面,大多数浏览器会显示“您确定要重新发送此数据吗”消息
- 如果用户重新打开页面(例如,在 URL 栏中按“返回”),所有这些状态信息都将丢失
- 用户无法共享他们正在查看的确切页面;内容部分由非用户可见信息决定
- 正在添加
POST
每个导航操作的数据都是巨大的痛苦。
关于python - 在 Django 中将变量从模板传递到 View 的更有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12097475/