Как захватить несколько аргументов, используя один RegEx в моем Django urls.py? - PullRequest
2 голосов
/ 20 сентября 2010

У меня есть приложение, которое позволяет фильтровать данные через 3 поля. Я пытаюсь написать RegEx в моем urls.py, который может захватывать несколько комбинаций без необходимости записывать каждую возможную комбинацию, если это ее собственный URL.

Вот мой urls.py:

#urls.py
urlpatterns = patterns('', 
    # Uncomment the next line to enable the admin:
    (r'^admin/', include(admin.site.urls)),

    (r'(?P<key>\w*?)=(?P<value>\w*?)&|$', views.scriptFilter),

Я протестировал вышеупомянутый RegEx на pythonregex.com, и он, кажется, захватывает столько пар ключ / значение, сколько я могу бросить на него. Однако когда я тестирую его в своем приложении, Django возвращает только набор запросов, основанный на первой паре, и игнорирует другие пары.

Например, если я введу это: http://MYSITE/feature=1&session=1&

Django возвращает данные только на основе feature = 1 и игнорирует сеанс = 1.

Вот мои взгляды.py:

#views.py
def scriptFilter(request, key, value):
    if key == 'session':
        sessionID = value
        qs = models.Script.objects.filter(session=sessionID)
    elif key == 'product':
        productID = value
        qs = models.Script.objects.filter(product=productID)
    elif key == 'feature':
        featureID = value
        scriptFeature = models.Feature.objects.get(pk=featureID)    
        qs = models.Script.objects.filter(feature=scriptFeature)
    else:
        qs = models.Script.objects.all()        
    caseTotal = qs.aggregate(Sum('caseCount'))
    scriptTotal = qs.aggregate(Count('subScriptName'))
    featureTotal = qs.aggregate(Count('feature'))
    return render_to_response('scripts.html', locals())

Я новичок в Python и Django, поэтому, пожалуйста, будьте осторожны :) Любая помощь будет очень признательна.

Ответы [ 2 ]

5 голосов
/ 20 сентября 2010

Эти могут быть действительными URL-адресами (не совсем точно), но они определенно не рекомендуются.

Если вы хотите разрешить отправку параметров в ваше приложение с помощью пар ключ-значение (как вы делаете здесь), я бы предложил просто использовать параметры запроса. Вот способ реализовать это на ваш взгляд:

def scriptFilter(request, session=None, product=None, feature=None):
    session = request.REQUEST.get('session',session)
    product = request.REQUEST.get('product',session)
    feature = request.REQUEST.get('feature',session)
    if session
        qs = models.Script.objects.filter(session=session)
    elif product:
        qs = models.Script.objects.filter(product=product)
    elif feature:
        qs = models.Script.objects.filter(feature=feature)
    else:
        qs = models.Script.objects.all()        
    caseTotal = qs.aggregate(Sum('caseCount'))
    scriptTotal = qs.aggregate(Count('subScriptName'))
    featureTotal = qs.aggregate(Count('feature'))
    return render_to_response('scripts.html', locals())

Затем вы бы назвали URL-адреса как

и т.д.

Обратите внимание, что я предполагаю, что когда вы говорите, что pythonregex захватил все группы, это, вероятно, потому, что вы смотрели на ответ .findall(). Я не уверен в точной механике диспетчера URL Django, но даже если вы просто подумаете об этом логически, как он может назначить более чем одно значение key и value? Ваша scriptFilter функция даже не обрабатывает несколько отправляемых значений. Вы действительно хотите, чтобы она читалась:

def scriptFilter(request, session=None, product=None, feature=None):
    session = request.REQUEST.get('session',session)
    product = request.REQUEST.get('product',session)
    feature = request.REQUEST.get('feature',session)
    qs = models.Script.objects.all()        

    if session
        qs = qs.filter(session=session)
    if product:
        qs = qs.filter(product=product)
    if feature:
        qs = qs.filter(feature=feature)
    caseTotal = qs.aggregate(Sum('caseCount'))
    scriptTotal = qs.aggregate(Count('subScriptName'))
    featureTotal = qs.aggregate(Count('feature'))
    return render_to_response('scripts.html', locals())

Наконец, я думаю, вам следует переписать и эти строки: caseTotal = qs.aggregate (Sum ('caseCount')) scriptTotal = qs.aggregate (Count ('subScriptName')) featureTotal = qs.aggregate (Count ('feature'))

Функция aggregate создает QuerySet с агрегированными значениями. Вы также можете сгруппировать их в один набор запросов:

    script_totals = qs.aggregate(Sum('casecount'), Count('subscriptname'), Count('feature'))

В шаблоне вы получите доступ к следующим значениям:

{{ script_totals.casecount__sum }}
{{ script_totals.subscriptname__count }}
{{ script_totals.feature__count }}

Что чище, чем

{{ caseTotal.casecount__sum }}
{{ scriptTotal.subscriptname__count }}
{{ featureTotal.feature__count }}
1 голос
/ 22 сентября 2010

Джордан,

Спасибо, что нашли время посмотреть и ответить на мой вопрос.Я ценю советы.Если кто-то еще найдет эту страницу, я нашел решение специально для моего вопроса RegEx по URL-адресу ниже:

Django: Произвольное количество неназванных параметров urls.py

Еще раз спасибо!

...