我一直在使用Django Forms一段时间,但最近我不得不创建一个表单来使用MultipleChoiceField搜索数据。 由于URL必须在用户之间共享,因此表单对服务器执行GET以将搜索参数保留在查询字符串中。 问题是如果检查了多个选项,则URL的长度会增加太多。例如:
http://www.mywebsite.com/search?source=1&source=2&source=3...
无论如何使用django表单来获取如下的URL:
http://www.mywebsite.com/search?source=1-2-3...
或者它是创建压缩查询字符串参数的令牌的更好方法吗?
然后使用该表单对ElasticSearch进行搜索。我没有使用djangos模型。
谢谢!
答案 0 :(得分:1)
覆盖get
上的get_context_data
和TemplateView
可能有效。然后你可以有这样的网址:http://www.mywebsite.com/search?sources=1,2
class ItemListView(TemplateView):
template_name = 'search.html'
def get(self, request, *args, **kwargs):
sources = self.request.GET.get('sources')
self.sources = sources.split(',') if sources else None
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.sources:
context['search-results'] = self.get_search_results(
self.sources,
)
return context
def get_search_results(self, sources):
"""
Retrieve items that have `sources`.
"""
# ElasticSearch code here…
data = {
'1': 'Honen',
'2': 'Oreth',
'3': 'Vosty',
}
return [data[source_id] for source_id in sources]
现在,如果请求了/search?sources=1,2
网址,则模板上下文中会有Honen
和Oreth
作为变量search-results
。