表单查询集过滤器无法正常工作,cleaning_data与“CHOICES = ...”不匹配

时间:2012-05-03 16:36:12

标签: python django forms filter django-queryset

我正在尝试创建一个允许最终用户过滤交易数据的表单。我有一个“付款方式”的过滤器。

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))

2 个答案:

答案 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)