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