Как в Django настроить urls.py в случае с одинаковыми адресами запроса?
Мне надо сделать два запроса с помощью Django. К проекту подключена база данных с городами, улицами, и магазинами. Запросы следующие:
POST /shop/- создание магазинаGET /shop/?street=&city=&open=- вывод данных
Мой код в urls.py
urlpatterns = [
path('shop/', views.Getshop),
path('shop/', views.Shopcreate),
]
Работа с строковым запросом и извлечением параметров идёт на ура, но выполняется только один запрос. Как отличить вышеуказанные два запроса друг от друга?
Вот мой код в views.py:
from django.shortcuts import render
from django.http import *
from .models import City
from .models import Street
from .models import Shop
import datetime
from django.utils import timezone
def Shopcreate(request):
return HttpResponse("<h2>Shop create</h2>")
def Getshop(request):
street = request.GET.get("street", -1)
city = request.GET.get("city", -1)
open = request.GET.get("open", -1)
if open == "1":
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__lte=timezone.now(),
shop_time_to_close__gte=timezone.now())
else:
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__gt=timezone.now(),
shop_time_to_close__gt=timezone.now())
return render(request, "getshops.html", {"shops": shops})
Как правильно написать файл urls.py, чтобы запросы отличались между собой, будучи похожими по написанию?
Ответы (1 шт):
Поиск соответствия url-паттернов идет сверху вниз. То есть в вашем случае всегда будет срабатывать верхний паттер с вызовом views.Getshop.
В вашем случае не требуется создавать два разных url для работы с одним и тем же паттерном. Объедините оба обработчика в один, анализируя метод передачи параметров. например:
urlpatterns = [
path('shop/', views.proc_shop),
]
def proc_shop(request):
if request.method == 'POST':
return HttpResponse("<h2>Shop create</h2>")
elif request.method == 'GET':
street = request.GET.get("street", -1)
city = request.GET.get("city", -1)
open = request.GET.get("open", -1)
if open == "1":
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__lte=timezone.now(),
shop_time_to_close__gte=timezone.now())
else:
shops = Shop.objects.filter(shop_city_id=city, shop_street_id=street, shop_time_to_open__gt=timezone.now(),
shop_time_to_close__gt=timezone.now())
return render(request, "getshops.html", {"shops": shops})