当前,我正在尝试创建动态过滤器以列出模板中的模型对象。这是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不变。如何使用新的对象列表重新渲染?
答案 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){ });
});