URL-адрес Django, передающий столько параметров, сколько вы хотите, с разделением /

#python #django #django-urls #django-url-reverse

#python #django #django-urls #django-url-reverse

Вопрос:

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

Я хотел бы добиться чего-то подобного:

 urlpatterns = [
    path('test/<str:var1>-<str:var2>/<str:var3>-<str:var4>/...', views.test, name='test'),
]
  

И в моей функции просмотра я бы определил это так:

 def test(request, *args, **kwargs):
    # Do whatever you want with kwargs
    return HttpResponse('Test')
  

Ответ №1:

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

Но если вы настаиваете на этом, вы можете использовать регулярные выражения ‘re_path’

 # urls.py

from django.urls import path, re_path
from django.conf.urls import url
from myapp import views

urlpatterns = [
    re_path(r'^test/(?P<path>.*)$', views.test, name='test'),
    # or use url instead it's same thing
    url(r'^test/(?P<path>.*)$', views.test, name='test'),
]
  

Комментарии:

1. Я действительно понятия не имею, как использовать регулярное выражение. Я посмотрю на учебные пособия по этому поводу. У меня только один вопрос: поможет ли мне re_path достичь того, о чем я просил?

2. @B.Виктор Проверьте отредактированный ответ Я добавляю код, который вам нужен

3. На самом деле это даст вам только один параметр ‘path’, но из этого параметра я могу разделить строку по своему усмотрению, а затем манипулировать ею по своему усмотрению. Спасибо

4. Другой вариант — использовать path('test/<path:path>', views.test, name='test') . path: Конвертер означает, что он соответствует косым чертам.

5. Обратите внимание, что url() это устарело в Django 3.1, поэтому не рекомендуется использовать его в новом коде.

Ответ №2:

Рассматривали ли вы возможность использования query_params ?

Это path('test', views.test, name='test')

URL: /test/?filter=asd ….

Затем получите доступ к нему через запрос в представлении:

 def test(request):
    params = request.GET.get('filter', None)
    return HttpResponse()
  

Посмотрите, сможете ли вы решить свою проблему таким образом 🙂

Комментарии:

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