Django: Передача параметров в url без использования файла urls.py

Как передать параметры через URL без использования файла urls.py?

Например, вместо того, чтобы создавать сложный url типа

example.com/page/12/red/dog/japan/spot

или что-то вроде этого, а затем соответствующая запись в urls.py, которая будет анализировать этот url и направлять его в представление, я хочу просто получить url, где я могу свободно добавлять или удалять параметры по мере необходимости, подобно уродливому способу

example.com/page?id=12&color=red&animal=dog&country=Japan&name=spot

Тогда в urls.py просто есть что-то вроде

path('page/<parameter_dictionary>', views.page, name='page' parameters='parameter_dictionary)

Если я должен использовать шаблоны url, как я могу учесть url, которые имеют параметры, которые могут соответствовать или не соответствовать шаблону, например иногда

http://example.com/page/12/red/dog/Japan/spot ->

path('page/<int:id>/<str:color>/<str:animal>/<str:country>/<str:name>', views.page, name='page'),

http://example.com/page/12/dog/red/Japan/->

path('page/<int:id>/<str:animal>/<str:color>/<str:country>', views.page, name='page')

http://example.com/page/dog/red/Japan/->

path('page/<str:animal>/<str:color>/<str:country>', views.page, name='page')

Не уверен, что выражаюсь ясно, поэтому попробую перефразировать.

По сути, я хочу иметь возможность передавать параметры в неопределенном порядке или неопределенное количество параметров, не беспокоясь о том, что они должны соответствовать установленному шаблону в urls.py.

Я хотел бы, чтобы любая информация, отправленная на http://example.com/page/ переходило в views.page(), а затем было доступно чем-то вроде

animal = request.GET['animal']
color = request.GET['color']
id = request.GET['id']

etc.

so

example.com/page?id=12&animal=dog&country=Japan&name=spot

example.com/page?id=12&color=red&animal=dog&name=spot

example.com/page?id=12&country=Japan&color=red&animal=dog&name=spot

все будет работать через одну запись в urls.py

Вы ищете параметры запроса и уже почти справились с этим. Следующий код не проверен, но вроде как должен работать:

def page(request):
    animal = request.GET.get("animal",None) # default None if not present
    color = request.GET.get("color",None)
    return render(request,'some_html.html')
# urls.py:
path('page/', views.page, name='page')

Вы получаете доступ к параметрам запроса через переданный объект запроса request.GET. Это объект типа dict. Основное отличие в том, что этот объект работает с несколькими ключами, например, если вы передадите эти параметры ?a=1&a=2 в ваш url, он преобразует request.GET.get("a") # Returns ["1","2"]. Подробнее о QueryDict здесь.

Также не забудьте узнать разницу и лучшие практики для url-параметров и параметров запроса. Пример сообщения Stackoverflow

Вернуться на верх