我正在尝试创建一个允许最终用户过滤交易数据的表单。我有一个“付款方式”的过滤器。
For Example: credit card, cash, check etc.
出于某种原因,我的结果不会过滤(没有显示)。我注意到表单从可用选项中更改了我的过滤器值。
For Example: the "cash" choice becomes [u'cash'].
如果我直接在我的过滤器中输入选项,它就可以了。
For Example: Transactions.objects.filter(payment_method__exact="cash")
不确定这是否与它有关...如何让我的过滤器工作?
模型:
class QueryForm(forms.Form):
payment_method = forms.MultipleChoiceField(choices=PAYMENT_TYPE)
查看:
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))
答案 0 :(得分:1)
尝试将payment_method
中的QueryForm
字段更改为普通ChoiceField
:
class QueryForm(forms.Form):
payment_method = forms.ChoiceField(choices=PAYMENT_TYPE)
forms.MultipleChoiceField
返回字符串列表。您没有显示Transactions
模型,但其payment_method
字段可能是CharField
。因此,我认为您正在尝试使用从CharField
返回的列表来过滤Transaction
模型中的QueryForm.MultipleChoiceField
。 (当您对字符串“cash”进行硬编码时,它可以正常工作)
答案 1 :(得分:1)
如果您使用过MultipleChoiceField,因为您确实希望能够选择多个项目 - 例如,您想要搜索付款方式为 现金或卡片的交易 - 您可以保留字段不变,但更改过滤器以使用__in
而不是__exact
:
results = Transactions.objects.filter(payment_method__in=p)