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

时间:2012-08-23 17:57:25

标签: 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> 

有没有办法避免使用它?谢谢!

2 个答案:

答案 0 :(得分:24)

有三种方法可以保留这类信息:

会议(我对你的情况的建议)

只需将您想要的数据填入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')

优点

  • 您的模板无需更改(除非删除现在不必要的表单)。
  • 清除网址
  • 即使关闭并重新打开浏览器窗口也会保留
  • 您无需担心用户修改或甚至查看会话数据(这样会更安全)

缺点

  • POST一样,网页内容由网址会话数据决定 - 网址不再是唯一的,用户无法共享依赖会话信息的特定网页< / LI>

查询参数

/match/?name1=foo1&userid1&name2=bar&userid2=2这样的东西。您可以手动添加这些内容(<a href='/match/?name1={{ male_results }}...),也可以将POST表单更改为GET

优点

  • 这些网址可以共享和添加书签;如果它是带有过滤选项的列表,这可能是可取的(“这是我喜欢的汽车列表”发布到Facebook,等。

缺点

  • 正如您已经注意到的,这些可以由用户自由修改
  • 将这些添加到每个URL是一个巨大的痛苦

POST表单(您当前的方法)

优点

  • 稍微隐藏一点(没有某种浏览器扩展程序,用户无法看到)
  • 稍微操纵一点(虽然不依赖于这种透明度的安全性)
  • 清洁网址

Disdvantages

  • 如果您使用浏览器的“后退”按钮,则会导致Internet Explorer上的“此页面已过期”消息...
  • 如果用户尝试重新加载您的任何网页,
  • ...和“您确定要在大多数浏览器上重新发送此数据”消息
  • 如果用户重新打开页面,则所有这些状态信息都将丢失(例如,在URL栏中按“return”)
  • 用户无法分享他们正在查看的确切页面;内容部分由非用户可见信息决定
  • 向每个导航操作添加POST数据是巨大的痛苦。

答案 1 :(得分:2)

有三种方法可以将数据从html页面导入服务器后端:URL(GET),表单(POST)和Cookie。

这三者中的任何一个都可能被操纵,因此无论如何都需要在服务器上验证所有内容。

就效率而言,根据您的帖子标题,URL(GET)变量稍微提高效率,因为表单数据在发送到服务器之前会经过一定程度的编码。

在正常使用情况下,标准是在从服务器检索数据时使用URL(GET)变量,并在想要操作(编辑/删除)服务器上的数据时使用表单(POST)变量。