【发布时间】:2022-09-23 04:52:37
【问题描述】:
我有一个简单的应用程序,我想让一个过滤器同时在两个不同的视图中动态更新查询集。
在此示例中,用户可以根据城市/国家/大陆进行过滤,并且我希望动态更新 (1) 显示模型中相关对象的表格,以及 (2) 用于绘制点的传单地图。
我认为这里的主要问题是我需要同时触发对多个“视图”上的过滤器查询集的更新,并且不确定如何构建我的项目来实现这一点。或者,如果那是思考问题的正确方法。
我试图让过滤器同时在两个不同的视图中使用{% for city in cityFilterResults %} 迭代器。
如何实现基于使用 HTMX 的过滤器更新两个不同的视图?
index.html:
(注意:如果我在表格或地图之间切换hx-get URL,我的预期行为会起作用。但它们不会一起过滤,这是我遇到的问题。)
<body>
<h3>Filter Controls:</h3><br>
<form hx-get=\"{% url \'_city_table\' %}\" hx-target=\"#cityTable\">
<!-- <form hx-get=\"{% url \'_leaflet\' %}\" hx-target=\"#markers\"> -->
{% csrf_token %}
{{ cityFilterForm.form.as_p }}
<button type=\"submit\" class=\"btn btn-primary\"> Filter </button>
</form>
[...]
<!-- Table Body -->
<tbody id=\"cityTable\" hx-get=\"{% url \'_city_table\' %}\" hx-trigger=\"load\" hx-target=\"nearest tr\"> </tbody>
[...]
<!-- Div to get the markers -->
<div id=\"markers\" hx-get=\"{% url \'_leaflet\' %}\" hx-trigger=\"my_custom_trigger from:body\"> </div>
</body>
<script>
[... Leaflet stuff ...]
document.getElementById(\'markers\');
</script>
_city_table.html:
{% for city in cityFilterResults %}
<tr>
<td> {{ city.city }} </td>
<td> {{ city.country }} </td>
<td> {{ city.continent }} </td>
<td> {{ city.latitude|floatformat:4 }} </td>
<td> {{ city.longitude|floatformat:4 }} </td>
</tr>
{% endfor %}
_leaflet.html:
<script>
if (map.hasLayer(group)) {
console.log(\'LayerGroup already exists\');
group.clearLayers();
map.removeLayer(group);
} else {
console.log(\'LayerGroup doesn\'t exist\');
}
{% for city in cityFilterResults %}
var marker = L.marker([{{city.latitude}}, {{city.longitude}}]).addTo(group)
.bindPopup(\"{{city.city}}\")
{% endfor %}
group.addTo(map);
</script>
views.py:
def _city_table(request):
city_filter_form = cityFilter(request.GET, queryset=cityModel.objects.all())
city_filter_results = city_filter_form.qs
context={ \'cityModel\': cityModel.objects.all(),
\'cityFilterResults\': city_filter_results }
response = render(request, \'_city_table.html\', context)
response[\'HX-Trigger\'] = \'my_custom_trigger\'
return response
def _leaflet(request):
city_filter_form = cityFilter(request.GET, queryset=cityModel.objects.all())
city_filter_results = city_filter_form.qs
context={ \'cityModel\': cityModel.objects.all(),
\'cityFilterResults\': city_filter_results }
return render(request, \'_leaflet.html\', context)
当过滤器表单上的 hx-get 指向 _city_table 模板的 URL 时,表格会按预期过滤,但地图不会:
当过滤器表单上的hx-get 指向_leaflet 模板的URL 时,地图会过滤,但表格不会:
标签: django django-filter htmx