私の質問から分かるかもしれませんが、私はPythonとdjangoの両方に新しいです。 **kwargs
を使用して、テンプレートからクエリセットの動的フィルタ仕様を許可したいと思います。私はkwargsの束の選択ボックスのように思っています。たとえば:テンプレートからkwargsを渡して表示しますか?
<select id="filter">
<option value="physician__isnull=True">Unassigned patients</option>
</select>
Djangoは、私はまだ遭遇していないこの問題のエレガントなソリューションを提供していますか?
私はこのフィルタを他のビューに渡す必要があるため、これを一般的な方法で解決しようとしています。たとえば、ページングされた患者のリストビューにフィルタを渡す必要があるため、ページネーションはどのアイテムと連携しているかを認識します。もう1つの例は、このフィルタを患者の詳細ページに渡す必要があるため、フィルタリングされた患者のリストを前/次のリンクで繰り返し処理することができます。
おかげでたくさん
、ピートアップデート:私は、このようなモデルのいずれかのタイプをフィルタリングすることができ
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
:私はFilterSpecification
クラスを構築して思い付いた何
:
filterSpec = FilterSpec('Assigned', Filter('service__isnull', False)))
patients = Patient.objects.filter(**filterSpec.kwargs())
シリアライズ、圧縮、いくつかの対称暗号化、およびURLセーフBase-64エンコーディングを適用して、これらのfilterSpecオブジェクトをクライアントからサーバーに渡します。唯一の欠点は、あなたがこのように見えるのURLで終わるということです。
http://127.0.0.1:8000/hospitalists/assign_test/?filter=eJwBHQHi_iDiTrccFpHA4It7zvtNIW5nUdRAxdiT-cZStYhy0PHezZH2Q7zmJB-NGAdYY4Q60Tr_gT_Jjy_bXfB6iR8inrNOVkXKVvLz3SCVrCktGc4thePSNAKoBtJHkcuoaf9YJA5q9f_1i6uh45-6k7ZyXntRu5CVEsm0n1u5T1vdMwMnaNA8QzYk4ecsxJRSy6SMbUHIGhDiwHHj1UnQaOWtCSJEt2zVxaurMuCRFT2bOKlj5nHfXCBTUCh4u3aqZZjmSd2CGMXZ8Pn3QGBppWhZQZFztP_1qKJaqSVeTNnDWpehbMvqabpivtnFTxwszJQw9BMcCBNTpvJf3jUGarw_dJ89VX12LuxALsketkPbYhXzXNxTK1PiZBYqGfBbioaYkjo%3D
私はこのアプローチにいくつかのコメントを取得し、他のソリューションを聞くのが大好きです。
あなたのDBでカスタムクエリを実行できるセキュリティホールを開く良い方法のようです。 – FogleBird
physician *やfirst_name *などの許可されたキーのリストを管理している場合、これがどのように問題を引き起こすかわかりません。 – slypete