作者djshen (djshen)
看板Python
标题Re: [问题] django static标签使用变数
时间Fri Dec 8 02:18:45 2017
※ 引述《fordpines (阿福)》之铭言:
: 如题
: 自己做的结果如下(route是右下角SUM_cda29a0a.json)
: https://imgur.com/ghEU8qW
: 他好像会直译的样子 就算只有
: 查了一下 虽然说有查到可以用下面的方法
: https://stackoverflow.com/questions/16655851/django-1-5-how-to-use-variables-ins
: 试了这样的写法
: https://imgur.com/GyGt4Z8
: 但会变成这样
: https://imgur.com/TrbqnmO
: 无关的地方反而错了(另外一个变数抓不到)<-这样改以前抓得到
: 之前是确定档案名称(e.g.data.json)用{%static data.json%}就好
: 但这次要从後段传过来的key找static里面同名的json档 不知道要怎麽办
: 可以请教一下解法吗?
你写web必须搞清楚的一点是 什麽事情是在後端处理 什麽事情是在前端处理
以这个例子来讲
file_temp1 = "{% static "+route+" %}"
这行主要发生了什麽事
1. render template
2. 传到browser (以上在server端发生 以下在client端发生)
3. parse HTML
4. parse & execute javascript
你主要搞混的地方是1和4
--
1. render template
django render template的时候 会用Lexer把template变成一个一个token
token分成几个type
variable: 用{{ }}包起来的部分
block: 用{% %}包起来的部分
comment: 用{# #}包起来的部分
text: 其他
在这边file_temp1 = "{% static "+route+" %}"会变成
file_temp1 = " 是text
static "+route+" 是block
" 是text
所以说 不管你是javascript还是什麽 只要不是variable, block或comment
django都当你是text
在render template的时候不要以为"{% static "是一对" %}"是一对
{% %}包起来的部分才是django在意的地方
接着Parser会根据不同的type来处理token 然後变成各种不同的Node
这边就会把{% if %}{% else %}{% endif %}这类有意义的东西组合起来变成IfNode
多个block的可以 当然单一个block的{% static %}也会被抓出来变成StaticNode
先来看看static tag的用法
{% static path [as varname] %}
as varname是optional
所以static "+route+"里面的path就是"+route+"
最後整个Node list再结合view过来的context render出结果
path "+route+"被解析为string 然後丢给StaticFilesStorage
StaticFilesStorage把STATIC_URL和path结合起来
变成/static/%2Broute%2B/ (/static/+route+/ escape後的结果)
原本那行变成
file_temp1 = "/static/%2Broute%2B/"
你应该可以在browser看到
--
4. execute javascript
因为你file_temp1右边早就变成"/static/%2Broute%2B/"
所以你前面的route根本就不会去影响到file_temp1
--
这样你懂了吗?
前端javascript再怎麽样也不可能直接去用後端的static这个东西
同样django也不会去管javascript
他们是两个不同的世界
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.162.110.53
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1512670728.A.C43.html