Фильтрация QuerySet на основе захваченных параметров URL в Django?

Я создаю общий шаблон, который будет отображать список объектов из набора запросов:

{% for o in objects %} {{ o.name }} {% endfor %} 

Я хочу иметь возможность использовать шаблон в нескольких ситуациях, где необходимо выполнить различные виды фильтрации и упорядочения. Я создал функцию просмотра для этого:

 def display_objects(request, filters, orders, template_name): objects = Object.objects.all() for filter in filters: objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), filter['value'])) for order in orders: objects = objects.order_by('-' if 'descending' in order else '' + order['field']) # render objects to template with context pass 

Я не уверен, что то, что я сделал до сих пор, даже сработает, но я столкнулся с проблемой. Я не знаю, возможно ли отфильтровать запрос, заданный параметром, зафиксированным в URL-адресе, с моей текущей функцией.

Например, если бы я хотел отображать объекты, относящиеся к определенному пользователю, я бы сделал что-то вроде:

 (r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact','value':account_username}], orders=[{'field':'foobar'}], template_name='user.html')) 

Очевидно, что account_username не является определенным полем, пока URL-адрес не будет разобран и отправлен в функцию display_objects. Было бы легко сделать функцию просмотра, которая принимает параметр account_username, но я хочу иметь возможность использовать эту функцию для отображения других наборов запросов объектов, которые будут отфильтрованы с различными захваченными параметрами.

Есть ли способ передать переданные параметры URL для функции просмотра, чтобы динамически фильтровать или заказывать набор запросов для отображения?

2 Solutions collect form web for “Фильтрация QuerySet на основе захваченных параметров URL в Django?”

Вот один из способов сделать это:

в urls.py:

 (r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact'}], orders=[{'field':'foobar'}], template_name='user.html')) 

А затем в views.py:

 def display_objects(request, filters, orders, template_name, **kwargs): objects = Object.objects.all() for filter in filters: objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), kwargs.get(filter['field']))) for order in orders: objects = objects.order_by('-' if 'descending' in order else '' + order['field']) # render objects to template with context pass 

Хотя честно, я не уверен, что это хороший способ сделать что-то …

Вы не можете передать строку непосредственно методу filter . Вам нужно перевести его в kwargs.

 query_string = '%s__%s' % (filter['field'], filter['relationship']) objects = objects.filter(**{query_string: filter['value']})) 
  • Форма django получила несколько значений для аргумента ключевого слова
  • Имитация запроса POST в Django
  • Вывод текста из urls.py в Django
  • Как разместить ссылку / url на домашней странице веб-сайта в Django?
  • Перезапустите сервер Django или httpd
  • Django - получить имена параметров, необходимых для обратного URL-адреса
  • Передача списка через url в django
  • разница между '^ $' и '' в url django
  • Python - лучший язык программирования в мире.