使用jinja2调用python方法对客户端没有影响

时间:2014-06-05 19:10:36

标签: jquery python ajax pyramid jinja2

我有一个模板页面,当用户访问网址(http://mysite/new_device

时会显示该页面
    config.add_route('new_device', '/new_device')

views.py方法:

@view_config(route_name="new_device", renderer='templates/main.html')
def new_device(request):
    do stuff......
    return dict(title=title, partial=partial, deviceTypes=deviceTypes, sections=sections)

当我转到该链接时,页面显示正确,jinja2打印了我的python方法的return语句中传递的所有数组和字典。

在我的页面上,我有一个select标签,其中包含一组用户可以选择的选项(变压器,交换机等),它将根据所选选项加载字段(ajax调用以获取数据) )。我想要做的是使用jquery和ajax加载相应的字段,方法是检查我所拥有的select的变化,获取id,然后对python方法new_device进行ajax调用。

$("#deviceTypes").change(function () {
    var deviceTypeID = $(this).val();

    var data = {
        "deviceTypeID": deviceTypeID
    }

    $.ajax({
        url: "http://127.0.0.1:6543/new_device",
        type: "POST",
        data: JSON.stringify(data),
        contentType: 'application/json; charset=utf-8',
        success: function (response, textStatus, jqXHR) {
        },
        error: function (jqXHR, textStatus, errorThrown) {
            //change this back to error throwing after wards
            alert("error");
        }
    });
});

我遇到的问题是从方法返回数据,但客户端没有使用新信息进行更新。

这是我的html页面的片段

    <select id="deviceTypes" class="inputBoxes">
        {% for key, value in deviceTypes.iteritems() %}
        <option value="{{key}}">{{value}}</option>
        {% endfor %}
    </select>

    <br />
    {% for sec in sections %}
        <label class="inputBoxLabels">{{sec}}</label><br />
    {% endfor %}

换句话说,jinja2在这里不打印新返回的信息。它只能在初始加载时访问一次数据或者它是如何工作的?

2 个答案:

答案 0 :(得分:1)

我不是python或jinja2开发人员,但从您的解释看起来您希望使用来自AJAX调用的数据填充deviceTypes下拉列表。为此,您需要在Success处理程序中为DOM操作添加逻辑。

$.ajax({
        url: "http://127.0.0.1:6543/new_device",
        type: "POST",
        data: JSON.stringify(data),
        contentType: 'application/json; charset=utf-8',
        success: function (data) {

               var options = $("#deviceTypes");
               $.each(data, function() {
                       options.append(new Option(this.key, this.value));
               });
        },

您可以参考以下链接在python中创建JSON数据。

How to populate a dropdownlist with json data in jquery?

答案 1 :(得分:0)

经过一段时间的考虑后,我想出了一个解决方案。 在我的网址中,我只添加了deviceTypeID参数

config.add_route('new_device', '/new_device/{deviceTypeID}')

然后,只要用户从列表中选择一个选项,我只需将页面重定向到该id,然后从我的python方法加载新返回的数据

    $("#deviceTypes").change(function () {
    var deviceTypeID = $(this).val();

    var data = {
        "deviceTypeID": deviceTypeID
    }

    window.location = "http://127.0.0.1:6543/new_device/" + deviceTypeID + "/0"
});