我有一个项目列表,每个项目都有一个复选框。用户选择一些项目,然后他可以通过键入查询来搜索其他项目,然后按“搜索”按钮进行POST。 我不想丢失之前选择的项目。因此,在我的视图中,我获取了存储在checkbxes值中的已检查项ID,然后将它们重新发送到模板。 问题是我使用ng-repeat而不是{%for%}来创建项目列表,因为我正在使用angularJS进行一些过滤任务,所以我无法知道当前项目的id是否存在于已检查的ID中在POST之后传递给模板的列表。
观看代码:
if 'btn_search' in request.POST:
checked_ids = get_integers_from_checked_checkboxes(request, 'checkbox_parent')
search_query = request.POST['txtbox_search']
sub_queries = search_query.split(' ')
for sub_query in sub_queries:
items= all_items.filter(items__name__contains=sub_query)
return render_to_response('my_page.html',
{'items': items,
'checked_items' : checked_ids},
context_instance=RequestContext(request))
简化的模板代码:
<!-- Search -->
<input type="text" name="txtbox_search">
<button name="btn_search"><b>Search</b></button>
<!-- Items' list -->
<input type="text" ng-model="filter_Search_box" placeholder="Filter search">
<ul class="list">
<li ng-repeat="item in items | filter:filter_Search_box">
<!-- This check box should be checked if the item.id is in {{checked_items}} -->
<input type="checkbox" value="{/item.id/}" name="checkbox_item"/>
<b>{/item.name/} </b>
</li>
答案 0 :(得分:1)
您应该考虑在angular和django应用之间使用ajax通信。所以你的django视图将返回json对象,它将由你的角度应用程序动态加载。你也可以用脏的方式实现它:
views.py
from django.core import serializers
if 'btn_search' in request.POST:
checked_ids = get_integers_from_checked_checkboxes(request, 'checkbox_parent')
search_query = request.POST['txtbox_search']
sub_queries = search_query.split(' ')
for sub_query in sub_queries:
items = all_items.filter(items__name__contains=sub_query)
items = serializers.serialize('json', items)
return render_to_response('my_page.html',
{
'items': items,
'checked_items': checked_ids
},
context_instance=RequestContext(request))
file_.html:
<script>
window.items = eval('(' + '{{ items }}' + ')');
</script>
角度控制器中的初始化:
$scope.ang_items = window.items;
然后你就可以用ang_items进行ng-repeat。但我非常不推荐这个解决方案。
你的for循环(for sub_query in sub_queries:
)也会在每次迭代时覆盖项目,这可能不是理想的事情。我建议您熟悉this。