2009-08-13 14 views
1

Wie Sie vielleicht von meinen Fragen erzählen können, bin ich sowohl mit Python als auch mit Django neu. Ich möchte dynamische Filterspezifikationen von Abfragesätzen aus meinen Vorlagen unter Verwendung von **kwargs zulassen. Ich denke wie eine Auslese von Kwargen. Zum Beispiel:Kwargs von der Vorlage zur Ansicht weitergeben?

<select id="filter"> 
    <option value="physician__isnull=True">Unassigned patients</option> 
    </select> 

Bietet Django eine elegante Lösung für dieses Problem, das ich noch nicht begegnet bin?

Ich versuche, dies in einer generischen Weise zu lösen, da ich diesen Filter zu anderen Ansichten übergeben muss. Zum Beispiel muss ich einen Filter an eine paginierte Patientenliste übergeben, damit die Seitennummerierung weiß, mit welchen Elementen sie arbeitet. Ein anderes Beispiel ist, dass dieser Filter an eine Patienten-Detailseite übergeben werden muss, damit Sie die gefilterte Liste von Patienten mit vorherigen/nächsten Links durchlaufen können.

Dank einem Haufen, Pete

Update:

Was ich mit war der Bau einer FilterSpecification Klasse kam:

class FilterSpec(object): 
def __init__(self, name, *args): 
    super(FilterSpec, self).__init__() 
    self.name = name 
    self.filters = [] 

    for filter in args: 
     self.add(filter) 

def pickle(self): 
    return encrypt(pickle.dumps(self)) 

def add(self, f): 
    self.filters.append(f) 

def kwargs(self): 
    kwargs = {} 
    for f in self.filters: 
     kwargs = f.kwarg(**kwargs) 
    return kwargs 

def __unicode__(self): 
    return self.name 



class Filter(object): 
def __init__(self, key, value): 
    super(Filter, self).__init__() 
    self.filter_key = key 
    self.filter_value = value 

def kwarg(self, **kwargs): 
    if self.filter_key != None: 
     kwargs[self.filter_key] = self.filter_value 
     return kwargs 

ich dann so jede Art von Modell filtern:

filterSpec = FilterSpec('Assigned', Filter('service__isnull', False))) 
patients = Patient.objects.filter(**filterSpec.kwargs()) 

Ich übergebe diese FilterSpec-Objekte vom Client an den Server, indem ich Serialisierung, Komprimierung, symmetrische Verschlüsselung und URL-Safe-Base-64-Codierung anwende. Der einzige Nachteil ist, dass Sie mit URLs sucht am Ende wie folgt:

http://127.0.0.1:8000/hospitalists/assign_test/?filter=eJwBHQHi_iDiTrccFpHA4It7zvtNIW5nUdRAxdiT-cZStYhy0PHezZH2Q7zmJB-NGAdYY4Q60Tr_gT_Jjy_bXfB6iR8inrNOVkXKVvLz3SCVrCktGc4thePSNAKoBtJHkcuoaf9YJA5q9f_1i6uh45-6k7ZyXntRu5CVEsm0n1u5T1vdMwMnaNA8QzYk4ecsxJRSy6SMbUHIGhDiwHHj1UnQaOWtCSJEt2zVxaurMuCRFT2bOKlj5nHfXCBTUCh4u3aqZZjmSd2CGMXZ8Pn3QGBppWhZQZFztP_1qKJaqSVeTNnDWpehbMvqabpivtnFTxwszJQw9BMcCBNTpvJf3jUGarw_dJ89VX12LuxALsketkPbYhXzXNxTK1PiZBYqGfBbioaYkjo%3D 

Ich würde gerne einige Kommentare zu diesem Ansatz bekommen und andere Lösungen zu hören.

+1

Sieht aus wie eine gute Möglichkeit, eine Sicherheitslücke zu öffnen, wo Benutzer benutzerdefinierte Abfragen auf Ihrer DB ausführen können. – FogleBird

+0

Wenn Sie eine Liste der zulässigen Schlüssel verwalten, wie Arzt * oder Vorname *, sehe ich nicht, wie dies ein Problem verursacht. – slypete

Antwort

1

Anstatt die schrecklichen Gefahren der SQL-Injection zu meistern, weisen Sie einfach jeder Select-Option einen Wert zu und lassen Sie die ausgewählte Abfrage basierend auf dem Wert von der Formularhandhabungsansicht ausführen.

Bei der Übergabe der Parameter für eine DB-Abfrage von Seite zu Ansicht wird nur nach einem Notfall gefragt. Django ist gebaut, um solche Dinge zu vermeiden.

+0

Dieser Filter wird in mehreren Ansichten benötigt. Ich versuche, dieses Problem auf generische Weise zu lösen. – slypete

0

Zu deinem Update: FilterSpecs sind leider eines dieser (seltenen) Stücke von Django, die keine öffentliche Dokumentation haben. Daher gibt es keine Garantie dafür, dass sie weiter so arbeiten werden.

Ein anderer Ansatz wäre Alex Gaynors django-filter, die wirklich gut durchdacht aussehen. Ich werde sie für mein nächstes Projekt verwenden.

+0

Danke Piquadrat. Ist Ihnen bekannt, ob der Django-Filter Sicherheit bietet, um sicherzustellen, dass nicht spezifizierte Filter nicht erlaubt sind? – slypete

+0

Leider gibt es bei Alex Implementierung keine Sicherheit. Ich kann jeden benutzerdefinierten Filter auswählen, den ich möchte. – slypete

Verwandte Themen