Django - 减少URL查询字符串长度

时间:2017-05-18 12:02:38

标签: django http django-forms query-string

我一直在使用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模型。

谢谢!

1 个答案:

答案 0 :(得分:1)

覆盖get上的get_context_dataTemplateView可能有效。然后你可以有这样的网址: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网址,则模板上下文中会有HonenOreth作为变量search-results