【问题标题】:django forms and filteringdjango 表单和过滤
【发布时间】:2011-05-20 13:45:00
【问题描述】:

所以我有这个工作选择表格,应该允许用户:

1) 选择一个 filterBy 单选按钮集。这让用户可以选择他想要用来过滤列表的方法。 (这将使用“filterBy”查询字符串执行 GET

2) 允许用户通过组合框中的对象过滤列表,该对象是 #1 的结果。此表单执行 POST 并将“过滤器”设置为 filterBy 对象的 pk

这是我的代码:

selectForm = JobSelectForm()
filterByForm = FilterByForm()
filterForm = FilterForm()

if request.method == 'POST':
    #this works just fine
    if 'job' in request.POST:
        return HttpResponseRedirect("/portal/jobs/%s/"%(request.POST['job']))

    if 'filter' in request.POST:
        filterForm = FilterForm(initial = {'filter': request.POST['filter']})

        ###### The Problem is below here
        ###### I cant get the 'filterBy' query string 
        ###### because this is a POST and not a GET
        ###### Is there a better way to write this filtering?

        if request.GET['filterby'] == 'G':
            obj = Group.objects.get(pk=request.POST['filter'])
            selectForm.fields['job'].queryset = Job.objects.filter(group=obj).order_by('name')
        elif request.GET['filterby'] == 'H':
            obj = Host.objects.get(pk=request.POST['filter'])
            selectForm.fields['job'].queryset = Job.objects.filter(host=obj).order_by('name')
        elif request.GET['filterby'] == 'L':
            obj = Location.objects.get(pk=request.POST['filter'])
            selectForm.fields['job'].queryset = Job.objects.filter(colo=obj).order_by('name')

###### All of this works fine too
elif request.method == 'GET':
    if request.GET.has_key('filterby'):
        if request.GET['filterby']:
            filterByForm = FilterByForm(initial = {'filterby': request.GET['filterby']})
            if request.GET['filterby'] == 'G':
                filterForm.fields['filter'].queryset = Group.objects.all().order_by('name')
            elif request.GET['filterby'] == 'H':
                filterForm.fields['filter'].queryset = Host.objects.all().order_by('name')
            elif request.GET['filterby'] == 'L':
                filterForm.fields['filter'].queryset = Location.objects.all().order_by('name')

【问题讨论】:

  • 为什么要分开 GET 和 POST?为什么不直接使用 GET 让这更简单?

标签: python django query-string filtering


【解决方案1】:

使用request.REQUEST(参见:Django Request and Response Objects)。它包含request.POSTrequest.GET 的值。

另外,在 Python 中使用字典时,您应该始终验证您尝试访问的密钥是否存在。这可以通过以下两种方式之一完成:

1) 显式测试字典中的键

if request.GET.has_key('filterby') and request.GET['filterby'] == 'G':
    obj = Group.objects.get(pk=request.POST['filter'])
    selectForm.fields['job'].queryset = Job.objects.filter(group=obj).order_by('name')

2) 使用字典的get 方法

if request.GET.get('filterby') == 'G':
    obj = Group.objects.get(pk=request.POST['filter'])
    selectForm.fields['job'].queryset = Job.objects.filter(group=obj).order_by('name')

使用dict.get,您还可以传递默认值:

if request.GET.get('filterby', valueIfKeyDoesntExist) == 'G':
    obj = Group.objects.get(pk=request.POST['filter'])
    selectForm.fields['job'].queryset = Job.objects.filter(group=obj).order_by('name')

【讨论】:

    【解决方案2】:

    您应该将有问题的代码放在表单的覆盖 __init__ 方法中。

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 2012-01-24
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 2017-03-27
      • 2021-11-15
      • 2014-02-10
      相关资源
      最近更新 更多