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.
Sieht aus wie eine gute Möglichkeit, eine Sicherheitslücke zu öffnen, wo Benutzer benutzerdefinierte Abfragen auf Ihrer DB ausführen können. – FogleBird
Wenn Sie eine Liste der zulässigen Schlüssel verwalten, wie Arzt * oder Vorname *, sehe ich nicht, wie dies ein Problem verursacht. – slypete