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

Jac*_*ack 11 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> 
Run Code Online (Sandbox Code Playgroud)

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

sup*_*cuo 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')
Run Code Online (Sandbox Code Playgroud)

好处

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

缺点

  • 与此同时POST,页面内容由URL 会话数据决定 - URL不再是唯一的,用户无法共享依赖于会话信息的特定页面

查询参数

有点像/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每个导航动作添加数据是一个巨大的痛苦.