Джанго формы и фильтрация - PullRequest
0 голосов
/ 20 мая 2011

Итак, у меня есть эта форма выбора заданий, которая должна позволять пользователю:

1) выбирать фильтр с помощью набора переключателей.Это позволяет пользователю выбрать, по какому методу он хочет отфильтровать список.(это выполнит GET со строкой запроса 'filterBy'

2) позволит пользователю отфильтровать список по объекту из списка, который является результатом # 1.Эта форма выполняет POST с 'filter', установленным в pk объекта filterBy

Вот код, который у меня есть:

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

Ответы [ 2 ]

1 голос
/ 20 мая 2011

Использовать request.REQUEST (см .: Объекты запросов и ответов Django ).Он содержит значения request.POST и request.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')
0 голосов
/ 20 мая 2011

Вы должны поместить свой проблемный код в переопределенный метод __init__ формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...