如何动态重新渲染模板?

时间:2019-02-09 14:45:10

标签: python jquery django

当前,我正在尝试创建动态过滤器以列出模板中的模型对象。这是django视图:

def view_data(request):
    text = request.GET.get('text')
    persons = None
    if text:
        try:
            persons = models.Person.objects.get(code__regex=text)
        except models.Person.DoesNotExist:
            pass
    return render(request, 'view_data.html',
                  {'persons': persons if not isinstance(persons, models.Person) else [persons]})

模板中的相关部分:

<div class="jumbotron row">
  <form>
    <label>Alanyok szűrése</label>
    <input id="filter" type="text" placeholder="Keresett alany">
  </form>
</div>

<div class="row">
  <div class="col-4">
    <div class="list-group" id="list-tab" role="tablist">
      {% for person in persons %}
        <a class="list-group-item list-group-item-action" id="list-{{person.code}}" data-toggle="list" href="#" role="tab" aria-controls="{{person.code}}">{{person.code}}</a>
      {% endfor %}
    </div>
  </div>
  <div class="col-8">
    <div class="visualisation content">
        <div class="canvas_div">
          <canvas id="Canvas1" width="540" height="250" style="border:1px solid #202020;">
          </canvas>
        </div>
    </div>
  </div>
</div>

ID为filter的输入字段在keyup事件上有一个回调,该事件向django发送一个请求,该请求包含在查询视图中使用的输入字段的内容。 这是回调:

$( "#filter" ).keyup(function() {
    $.get("", {text: $('#filter').val()});
});

当我用Pycharm调试器检查它时,渲染返回正确的html,但是在客户端,html不变。如何使用新的对象列表重新渲染?

2 个答案:

答案 0 :(得分:3)

将您要替换的html代码的一部分放入新的html文件中,如下所示:

new_html:

<div class="list-group" id="list-tab" role="tablist">
  {% for person in persons %}
    <a class="list-group-item list-group-item-action" 
       id="list-{{person.code}}" data-toggle="list" 
       href="#" role="tab" aria-controls="{{person.code}}">
       {{person.code}}
    </a>
  {% endfor %}
</div>

现在在您的视图中,用新的html文件替换旧的html文件(正在渲染)的名称,如下所示:

 return render(request, 'new_html.html',
             {'persons': persons if not isinstance(persons,models.Person) else [persons]})

,现在在您的ajax中,您可以像这样动态加载此new_html

 $( "#filter" ).keyup(function() {
    $.get("", 
          {text: $('#filter').val()},
          function(data){
              $( "#list-tab" ).replaceWith( data );
          } 
    );
});

答案 1 :(得分:1)

您不会对返回的数据做任何事情。在get方法调用中添加一个回调函数。您会从服务器的第一个参数中获得响应。使用它可以隐藏和显示页面上的内容。或者甚至可以替换DOM中的元素。参见jquery.replaceWith

$( "#filter" ).keyup(function() {
    $.get("", {text: $('#filter').val()}, function(response){  });
});