1

因此,我使用django_tables2的部分代码依赖于这个包,但这应该与整体问题无关。

forms.py

class PersonForm(forms.Form):
    date_from = forms.DateField(input_formats='%d/%m/%Y')
    date_to = forms.DateField(input_formats='%d/%m/%Y')

views.py

def filter(request):
    table = PersonTable(Person.objects.all())
    if request.method == 'POST':
        form = PersonForm(request.POST)
        if form.is_valid():
            date_from = form.cleaned_data['date_from']
            date_to = form.cleaned_data['date_to']
            result_filtered = table.filter(date__range=(date_from, date_to))

            RequestConfig(request, paginate={"per_page": 100}).configure(table)
            return render(request, "people.html", {
                         "table": result_filtered })

    args = {}
    args.update(csrf(request))
    args['form'] = PersonForm()
    args['table'] = table
    RequestConfig(request, paginate={"per_page": 100}).configure(table)
    return render(request, 'people.html', args)

简单地说,过滤不起作用。我可以看到整个表格,但是当我尝试过滤时没有任何反应。你能看出有什么问题吗?

4

2 回答 2

2

我很确定您需要调用.filter()查询集而不是表。例如:

result_filtered = PersonTable(Person.objects.filter(date__range=(date_from, date_to))

此外,在这一行:

RequestConfig(request, paginate={"per_page": 100}).configure(table)

你正在传入table。你应该通过result_filtered

于 2013-09-18T21:23:34.950 回答
1

这是我这样做的一种方式,假设你的Person模型有一个date字段:

def filter(request):
    if 'date_from' in request.GET and 'date_to' in request.GET:
        # form data has been submitted
        form = PersonForm(request.GET)
        if form.is_valid():
            date_from = form.cleaned_data['date_from']
            date_to = form.cleaned_data['date_to']
            people = Person.objects.filter(date__range=(date_from, date_to))
            table = PersonTable(people)
        else:
            table = PersonTable(Person.objects.all())
    else:
        form = PersonForm()
        table = PersonTable(Person.objects.all())
    RequestConfig(request, paginate={"per_page": 100}).configure(table)
    args = {}
    args.update(csrf(request))
    args['form'] = form
    args['table'] = table
    return render(request, 'people.html', args)

如果两个预期字段都存在,这将绑定表单,并根据结果限制查询集(如果有效)。如果无效,它将呈现绑定表单和从无限表构建的表。如果未提交表单数据,则呈现从无限制表构建的表。

如果使用这种设计,您的表单标签的method属性应该是GET而不是。POST

这并不完全遵循通常的 Django 表单处理模式,因为表单实际上并没有进行任何更改,因此您可以使用GET并且不需要在成功时返回重定向。

于 2013-09-18T21:47:18.230 回答