2017-07-19 3 views
1

ÜBERBLICKWie kann ich Abfrageparameter dynamisch request.GET in Django


Eine URL mit Abfrageparametern aussieht.

http://example.api.com/search/?name=jhon&age=26 

und zu sehen, wenn ich django-filter alle Parameter bin mit von der Anfrage automatisch extrahiert werden, und es wird ein gefilterte Abfrage-Set zurückzukehren.

views.py

class SearchView(TemplateView): 
    template_name = "search.html" 

    def get_queryset(self): 
     return SearchFilter(request.GET, queryset=Model.objects.all()).qs 

    def get_context_data(self, **kwargs): 
     context = super(SearchView, self).get_context_data(**kwargs) 
     return context 

Wenn ich will es aus request.GET manuell extrahieren ich tun kann.

def get_queryset(self): 
    # extracting query parameter 
    q = self.request.GET.get('name') 

PROBLEM ERKLÄRUNG


url Meine Suche sieht aus wie

http://example.api.com/search/jhon-26 

Ich tue dies, weil ich will nicht Tasten wie 'Name' zeigen und ‚Alter 'zu öffentlich, dies ist für Sicherheitsabstraktion das sind die Spalten meiner db-Tabelle.

I jhon-26 in ** kwargs bin immer, ich will es spalten und als Abfrageparameter zu request.GET so eingestellt, dass meine Filterklasse wird

FRAGE


funktionieren Ist Gibt es irgendetwas, um das Attribut an request.GET zu setzen?

# may be any set function available for this 
self.request.GET.set('name', 'jhon') 

Wie kann ich das erreichen?

+0

Warum nicht in Sitzung? und Zugriff in der Filteransicht? – Exprator

+0

Wie kann ich auf die Anforderungssitzung in meiner Filterklasse zugreifen? – Satendra

+0

Wenn Sie normalerweise auf Sitzungen in Sichten zugreifen, importieren Sie einfach die Anfrage in diese Datei. – Exprator

Antwort

1

fand ich Lösung Abfrageparameter einstellen here

Als request.GET QueryDict Instanz unveränderlich ist request.GET so können wir es nicht direkt ändern, so dass wir für seine _mutable Eigenschaft auf True

festlegen müssen
if not request.GET._mutable: 
    request.GET._mutable = True 

# now you can edit it 
request.GET['name'] = 'jhon' 
request.GET['age'] = 26 
1

Nun können Sie das tun, was django-Filter ist für Sie einfach zu sagen:

result = Model.objects.filter(**dict) 

jedoch für request.GET, würden Sie es formatiert werden müssen, um ein gültiges Wörterbuch zu machen, da es Werte sind normalerweise auflisten. Sie können einfach tun:

formatted = {key: dictionary.get(key)[0] for key in dict(request.GET).keys()} 

Und dann können Sie die verbleibenden Variablen in sie hinzufügen:

formatted['age'] = 26 //As extracted from **kwargs. etc. 

Und dann tun:

result = Model.objects.filter(**formatted) 

Wenn Sie brauchen nicht unbedingt Anfrage verwenden .GET (Da es einen Weg gibt, was der Django-Filter macht), können Sie einfach Ihr Wörterbuch bilden und es in der Filtermethode des Modells verwenden.

Übrigens, warum verwenden Sie request.GET, wenn Sie nicht möchten, dass die Öffentlichkeit Ihre Daten sieht? Wie hast du deine URL erstellt? Vielleicht möchten Sie all das ignorieren, solange Ihr Code trotzdem gut funktioniert!

+0

Django-Filter-Konfigurationen ermöglichen es uns, Filterung einfach zu machen und Overheads zu entfernen, denen wir gegenüberstehen, wenn wir eine manuelle Anfrage an ein Filterobjekt schreiben, auch eine Filterfunktion modular zu machen, die zu befolgen ist. Auch ich möchte meine Daten zur Öffentlichkeit zeigen, aber ich will nur Schlüssel, die direkt eine Spalte in db-Tabelle sind, abstrakt, Also, wenn ich es schaffe, zu tun, was ich frage, ist viel effizienter Weg, denke ich. – Satendra

+0

Es ist ohne Django-Filter erreichbar, wie Sie erklärt haben. Aber wie wird es mit Django-Filter funktionieren? Gibt es einen möglichen Weg? – Satendra

+1

Vielleicht möchten Sie Ihre Werte zu request.GET dann hinzufügen. 'request.GET' ist ein Diktat, so dass Sie' request.GET ['new_key'] = value' einfach ausführen können. Es ist jedoch standardmäßig unveränderlich, sodass Sie die Unveränderlichkeit mit 'request.GET._mutable = True 'entfernen müssen. ** Dies wird jedoch nicht empfohlen ** –

Verwandte Themen