python - 在 Django 中将变量从模板传递到 View 的更有效方法是什么?

标签 python django templates view

我的问题涉及将变量从模板传递到 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/

相关文章:

python - 在 python 中用空字符串替换捕获的组

python - 我知道 scipy curve_fit 可以做得更好

c++ - 接受 STL_container_type<string>::iterator 的模板化参数

python - 非序列化数据的共享内存缓存

python - numpy.random.seed 是否使结果固定在不同的计算机上?

django admin 1.7 + django-grappelli 2.6.1 中的 jQuery 日期选择器本地化

python - 有没有一种类似于这种方式的方法来在 django 中保存文件(.docx、pdf...)?

python - 记录我的 Django 代码

c++ - std::conditional 的可变模板使用,其中一种类型是实例化失败

html - 用响应式模板中的文本框替换下拉菜单