我的视图将提供一个"build_id"的字典,还有另一个视图响应程序生成给定build_id的详细信息。也就是说,第二个视图"build_details"包含一个参数"build_id"。
因为我从字典中至少有一个id,所以我要生成一个表。
<table>
<tr>
<td> Number </td>
<td> Actions </td>
</tr>
{% for index, value in build_history.items %}
<tr>
<td> {{index}} </td>
<td>
<select id="action_menu">
<option value=''>-----</option>
<option value="build_{{value.build_id}}">Build Details</option>
</select>
</td>
</tr>
每一行都应有一个选择框。当我选择Build Details
时,我应该重定向到另一个页面。
我的Jquery尝试:
function onSelectChange(){
var select = $("#action_menu option:selected");
if(!(select.val() == ""))
var build_id = select.val().replace('build_','');
window.location.href="{% url build_details build_id %}";
}
</script>
问题错误是:
渲染时捕获NoReverseMatch:"build_details"的反向找不到具有参数"(",)"和关键字参数"{}"的。
我认为这个刻薄的build_id没有正确呈现。。。因为我们不是在JS端(浏览器端..)动态构建build_id
我能做什么?我知道我可以使用硬编码http://mydomain和concated build_id-这将起作用。但是我可以利用模板标签吗?我怎样才能做到这一点?
谢谢。
最终工作代码
假设我有一个包含字典长度的变量,当我们有多个同名的<select>
时,服务器将其视为一个实体。因此,我们可以使用类的名称,并给每个<select>
(每行有一个)一个唯一的数字ID。
# Javascript
<script type="text/javascript">
urlMap = {
{% for index, value in build_history.items %}
'{{ value.build_id }}' : '{% url build_details value.build_id %}'{% if not forloop.last %},{% endif %}
{% endfor %}
};
$(function() {
var item_len = parseInt({{dict_len}});
for (var i = 0; i < item_len; i++){
$("#"+i.toString()+".action").change(function() {
if($(this).val() != '')
window.location.href = urlMap[$(this).val()];
}
)
}});
</script>
# HTML (this is a table, each row has one select)
<select class="action" id={{index}}>
<option value=''>-----</option>
<option value="{{ value.build_id }}">Build Details</option>
</select>
JavaScript与django模板100%不兼容。django模板呈现HTML和Javascript,然后运行Javascript——此时,模板标签甚至不存在。
您必须将选项值->URL与django的组合存储在javascript数组中。
### Javascript map
urlMap = {
{% for value in build_history.values %}
{{ value.build_id }}: '{% url build_details value.build_id %}'
{% if not forloop.last %},{% endfor %}
{% endfor %}
};
function onSelectChange(){
var select = $("#action_menu option:selected");
if(!(select.val() == ""))
var build_id = select.val().replace('build_','');
window.location.href=urlMap[build_id];
}
您也可以使用jQuery的data
函数将数据绑定到一个元素:
### Jquery data
{% for value in build_history.values %}
$("#action_menu option[value=build_{{ value.build_id }}]")
.data('href', '{% url build_details value.build_id %}');
{% endfor %}
function onSelectChange(){
var select = $("#action_menu option:selected");
if(!(select.val() == ""))
window.location.href=select.data('href');
}
请复制并粘贴此。
<script type="text/javascript">
urlMap = {
{% for index, value in build_history.items %}
'{{ value.build_id }}' : '{% url build_details value.build_id %}'{% if not forloop.last %},{% endif %}
{% endfor %}
};
$(function() {
$("#foo").change(function() {
window.location.href = urlMap[$(this).val()];
});
})
</script>
<select id="foo">
<option value="">---</option>
{% for index, value in build_history.items %}
<option value="{{ value.build_id }}">Build Details</option>
{% endfor %}
</select>