2012-05-03 4 views
0

エンドユーザーがトランザクションデータをフィルタリングできるフォームを作成しようとしています。私は "支払い方法"のフィルタを持っています。フォームクエリセットフィルタが機能していません。「CHOICES = ...」と一致しないcleaned_data

For Example: credit card, cash, check etc. 

何らかの理由で、私の結果がフィルタリングされず(何も表示されません)。フォームが私のフィルターの値を利用可能な選択肢から変更することに気付きました。

For Example: the "cash" choice becomes [u'cash']. 

選択肢のオプションをフィルタに直接入力すると機能します。

For Example: Transactions.objects.filter(payment_method__exact="cash") 

これは関係があるかどうかわかりません。どうすればフィルタを動作させることができますか?

MODELS:

class QueryForm(forms.Form): 
    payment_method = forms.MultipleChoiceField(choices=PAYMENT_TYPE) 

VIEW:

def findtransation(request): 
    qf = QueryForm() 
    if request.method == "POST": 
     qf = QueryForm(request.POST) 
     if qf.is_valid(): 
      p = qf.cleaned_data['payment_method'] 
      results = Transactions.objects.filter(payment_method__exact=p) 
      return render_to_response('testdb/results.html', {'results': results, 'query_form': qf,}, context_instance=RequestContext(request)) 
    return render_to_response('testdb/results.html', {'query_form': qf,}, context_instance=RequestContext(request)) 

答えて

1

実際に複数のアイテムを選択できるようにするためにMultipleChoiceFieldを使用したことがある場合(たとえば、支払方法のトランザクションを検索する場合など)あるいずれか現金またはカード - あなたはそれがあるとしてフィールドを保つが、__exactの代わりに__inを使用するようにフィルタを変更することができます。

results = Transactions.objects.filter(payment_method__in=p) 
1

は、プレーンChoiceFieldにごQueryFormpayment_methodフィールドを変更してみてください:

class QueryForm(forms.Form): 
    payment_method = forms.ChoiceField(choices=PAYMENT_TYPE) 

A forms.MultipleChoiceField文字列のリストを返します。 Transactionsモデルは表示されませんでしたが、そのpayment_methodフィールドはおそらくCharFieldです。だから私はQueryForm.MultipleChoiceFieldから返されたリストを使用して、TransactionモデルのCharFieldをフィルタリングしようとしていると思います。

+0

素晴らしい、それは動作しますが、今、私はオプションを1つだけ選択することを強制しています。複数のオプションを選択するにはどうすればよいですか? – thedeepfield

+0

複数の支払い方法で取引を作成することはできますか?クレジットカードで部分的に支払い、部分的に現金で支払いますか?ダニエル・ローズマンの答えはあなたが必要と思われることをする方法を説明します。 – alan

関連する問題