{% url %} and jquery



我的视图将提供一个"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>

最新更新