2017-05-18 3 views
1

Ich habe eine Weile mit Django Forms gearbeitet, aber vor kurzem musste ich ein Formular erstellen, um nach Daten mit einem MultipleChoiceField zu suchen. Da die URL zwischen den Benutzern freigegeben werden muss, führt das Formular einen GET-Befehl an den Server aus, um die Suchparameter in der Abfragezeichenfolge beizubehalten. Das Problem ist, dass, wenn mehrere Optionen überprüft werden, die Länge der URL zu sehr zunimmt. Zum Beispiel:Django - Verringern der Länge der URL-Abfragezeichenfolge

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

Gibt es trotzdem mit django Formen arbeiten eine URL wie folgt zu erhalten:

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

Oder ist es ein besserer Ansatz ein Token zu erstellen, die die Abfrage-String-Parameter zu komprimieren?

Das Formular wird dann verwendet, um eine Suche über ElasticSearch durchzuführen. Ich benutze keine Djangos-Modelle.

Danke!

+0

Hat meine Antwort geholfen? – Matt

Antwort

1

Overriding get und get_context_data auf einem TemplateView könnte funktionieren. Dann könnten Sie eine URL wie dieses: 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] 

Wenn nun die /search?sources=1,2 URL der Vorlage Kontext Honen und Oreth darin als Variable search-results hätte angefordert wurde.

+0

Hallo Matt, ich denke, das ist eine gute Idee, trifft aber nicht auf mein Problem zu. Ich habe vergessen zu erwähnen, dass ich kein Django-Modell verwende. Die Daten stammen von ElasticSearch, daher ist kein herkömmliches Modell beteiligt. Ich werde die Frage aktualisieren. –

+0

In diesem Fall könnten Sie eine 'TemplateView' verwenden und eine Methode hinzufügen, um die Ergebnisse von ElasticSearch abzurufen. Ich werde meine Antwort aktualisieren. – Matt