2017-05-18 5 views
1

잠깐 동안 Django Forms 작업을 해왔지만 최근에는 MultipleChoiceField를 사용하여 데이터를 검색하는 양식을 만들어야했습니다. URL은 사용자간에 공유되어야하기 때문에 양식은 쿼리 문자열에 검색 매개 변수를 보관하기 위해 서버에 GET을 수행합니다. 여러 옵션을 선택하면 URL의 길이가 너무 길어지는 문제가 있습니다. 예를 들어 :Django - URL 쿼리 문자열 길이 줄이기

http://www.mywebsite.com/search?source=1&source=2&source=3... 

는 다음과 같은 URL을 얻을 장고 형태의 작업 어쨌든 거기 :

http://www.mywebsite.com/search?source=1-2-3... 

을 아니면 쿼리 문자열 매개 변수를 압축 토큰을 만들 수있는 더 나은 방법인가?

그런 다음 양식을 사용하여 ElasticSearch를 검색합니다. 나는 장고 모델을 사용하지 않는다.

감사합니다!

+0

내 대답이 도움이 되었습니까? – Matt

답변

1

getget_context_dataTemplateView으로 대체 할 수 있습니다. /search?sources=1,2 URL이 요청 된 경우 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-results로의 HonenOreth있을 것입니다 : 그럼 당신은이 같은 URL을 가질 수 있습니다.

+0

안녕하세요 매트, 좋은 생각이라고 생각하지만 제 문제에는 해당되지 않습니다. 장고 모델을 사용하지 않는다는 사실을 잊어 버렸습니다. 데이터는 ElasticSearch에서 제공되므로 기존 모델은 포함되어 있지 않습니다. 나는 그 질문을 갱신 할 것이다. –

+0

그 경우, 당신은'TemplateView'을 사용하고 ElasticSearch로부터 결과를 검색하기위한 메소드를 추가 할 수 있습니다. 내 대답을 업데이트 할게. – Matt