我想使用3个复选框过滤搜索结果 . 结果显示在div中 id=posts_results
<div class="checkbox">
<label><input type="checkbox" id="id1" class="typePost" value="En groupe"> val1 </label>
</div>
<div class="checkbox">
<label><input type="checkbox" id="id2" class="typePost" value="En groupe"> val2 </label>
</div>
<div class="checkbox">
<label><input type="checkbox" id="id3" class="typePost" value="A domicile"> val3</label>
</div>
<div class="checkbox">
<label><input type="checkbox" id="id4" class="typePost" value="Par webcam"> val4</label>
</div>
<div id="posts_results">
{% include 'posts/posts_results.html' %}
</div>
<script>
$('.typePost').change(function (request, response) {
var v1=$('#id1').is(":checked")? 1:0;
var V2=$('#id2').is(":checked")? 1:0;
var V3=$('#id3').is(":checked")? 1:0;
var v4=$('#id4').is(":checked")? 1:0;
$.ajax({
url: '/posts/type_lesson/',
dataType: 'json',
type: "GET",
data: {
group: groupChecked,
webcam: webcamChecked,
home: homeChecked,
move: moveChecked,
distance: distance,
},
success: function (object_list) {
$('#posts_results').load("my_page.html", object_list);
alert('after')
}
});
});
<script>
这是我的网址:
url(r'^filter/$', views.filter, name='filter_type_lesson'),
这是我的看法:
def filter(request):
if request.method=='GET':
#as an exemple I'll send all posts
data= PostFullSerializer(Post.objects.all(), many=True)
return JsonResponse(data.data, safe=False)
过滤器函数根据json发送的数据执行一些过滤器,序列化过滤后的帖子并将其发回(在这种情况下,我发送所有帖子作为示例) .
使用id为“posts_results”的div中的forloop显示结果,html位于posts_results.html文件中 .
发送json数据但ajax成功函数不更新或加载div
而且它也有可能留下来
2 回答
我希望尽可能远离原始的POST数据,让表单API完成繁重的工作 . 你可以用更安全的方式用更少的代码完成你已经拥有的东西 .
创建一个包含四个BooleanFields的表单,这些BooleanFields是为模型中的BooleanFields命名的 . 您可以使用label变量覆盖它们在HTML中的显示方式 .
输出为
<form class="my_form">{% csrf_token %}{{form.as_table}}</form>
像这样提交JS:
提交表单并进行验证后,请使用cleaning_data属性并按此过滤模型
这将起作用,因为表单字段和名称与模型中的字段相同 . 和做
Post.objects.filter(my_field=True, my_field2=True, my_field3=False)
一样 . 然后你可以用它做任何你想做的事 . 我会用FormView
做这一切:现在没有什么可以自己更新div了 . 它仅在最初请求HTML时创建 . 在您的成功功能中,您需要手动附加元素,如下所示:
您也可以通过ajax过去渲染HTML并执行
$('#post_results').html(data);
. 您可以在FormView上调用self.render_to_response
,而不是调用json响应 .也许您可以尝试在视图中渲染模板,然后在div中加载渲染的数据 .
假设你的
posts/posts_results.html
是:在您的视图中,在您执行相应操作时,您可以呈现模板并将html内容添加到响应中,即(基于您当前的代码):
然后在你的JS中,在检查ajsx响应的瞬间,你可以将渲染的内容添加到div中
我建议你不要一个一个地创建数据到你的ajax请求,使用
serialize
方法的jquery或者创建一个FormData
对象,而不是GET,使用POST来做你的请求更安全