Как использовать необязательный параметр в django URL - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу решить, как Django URL работает без какого-либо необязательного параметра или с необязательным параметром.

Вот структура URL, которую я хочу:

path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>-vs-<slug:brand_slug3>/',views.compare_brand)

Теперь я хочу что-то как и первые два слага для сравнения является обязательным, поэтому, согласно приведенному выше URL

path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>',views.compare_brand)

Это работает нормально, потому что это обязательный параметр url, но я хочу передать необязательный url из второго vs в brand_slug3.

Кто-нибудь может мне помочь в этом?

1 Ответ

1 голос
/ 26 февраля 2020

Вы не можете сделать это так в django urls.py. Но вы можете передать строку URL-запроса в представление. Например, если вы нажмете этот URL:

http://localhost:8000/Category1-comparison/Brand1-vs-Brand2/?vs=Brand3

Тогда вы можете поймать значение Brand3 из request.GET. Например:

def compare_brand(request, category_slug, brand_slug1, brand_slug2):
     brand_slug3 = request.GET.get('vs')

Лучшее решение:

Может быть, лучше всего использовать строку запроса URL-адреса все вместе. Потому что таким образом URL будет намного чище. Например:

# url

path('/comparison/<slug:category_slug>/', compare_brand)

# view
def compare_brand(request, category_slug):
    brands = request.GET.getlist('brands')
    if len(brands) < 2:
        raise Exception('Need 2 brands atleast')

# browser url
http://localhost:8000/comparison/Cat1/?brands=Brand1,Brand2

Из комментариев

Вы можете создать еще один URL, указывающий на то же представление

# url
path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>-vs-<slug:brand_slug3>/',views.compare_brand),
path('<slug:category_slug>-comparison/<slug:brand_slug1>-vs-<slug:brand_slug2>/',views.compare_brand)

# view

def compare_brand(request, category_slug, brand_slug1, brand_slug2, brand_slug3=None):
    if brand_slug3:
       # do something
...