2009-08-13 8 views
1

私の質問から分かるかもしれませんが、私は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 

私はこのアプローチにいくつかのコメントを取得し、他のソリューションを聞くのが大好きです。

+1

あなたのDBでカスタムクエリを実行できるセキュリティホールを開く良い方法のようです。 – FogleBird

+0

physician *やfirst_name *などの許可されたキーのリストを管理している場合、これがどのように問題を引き起こすかわかりません。 – slypete

答えて

1

SQLインジェクションの恐ろしい危険に直面するのではなく、各選択オプションに値を割り当て、その値に基づいて選択したクエリをフォーム処理ビューで実行させるのはなぜですか。

DBクエリのパラメータをページからビューに渡すだけで、災害が発生することがあります。 Djangoはこの種のことを避けるために作られています。

+0

このフィルタは複数のビューで必要になります。私はこの問題を一般的な方法で解決しようとしています。 – slypete

0

あなたのアップデートに関して:FilterSpecsは残念なことに、公開ドキュメントが不足している(まれな)Djangoの1つです。そのように、彼らが彼らのように働くことを保証するものではありません。

もう1つのアプローチは、Alex Gaynorのdjango-filterを使用することです。これは本当によく考えられています。私は次のプロジェクトに使用します。

+0

ありがとうございます。 django-filterが不特定のフィルタが許可されていないことを保証するセキュリティを提供しているかどうか知っていますか? – slypete

+0

残念ながら、Alexの実装にはセキュリティはありません。私は、私が望む任意のカスタムフィルタを選択することができます。 – slypete

関連する問題