I am creating a booking website for hotels using Django, I used the booking api to get the hotels with its images and location highlights… I sent to the django template a list of dictionaries from the backend, each dict represents a hotel, now there is two apis request that I am using
1- To get all the hotels
2-To get the images and location highlights of the hotel based on its id that 1 will give me alongside other info like the name and address… (when a button is pressed)
I implemented a loop in the template that will fetch all the hotels from the list on the page and I used the id of the hotel to pass it to a url namespace in the template (Template.html) where I want to call a function (book_now) and pass the arguments below: id of the hotel, name of the hotel, address of the hotel.
Now what’s happening is that when I choose certain destination like Berlin or Istanbul or Paris I get this error:
NoReverseMatch at /homepage/
Reverse for 'book_now' with keyword arguments '{'id_hotel': **'6140138'**, 'name': 'Vital Hotel Fulya Istanbul Sisli', 'add': 'FULYA MAH. MEHMETÇİK CAD. NO: 61 İÇ KAPI NO: 3 ŞİŞLİ/İSTANBUL '}' not found. 1 pattern(s) tried: ['homepage/Book_now/(?P<id_hotel>[^/]+)/(?P<name>[^/]+)/(?P<add>[^/]+)$']
If I choose Dubai , Madrid , Los Angeles everything is working normally I don’t know why its not logic
and and If I run book_now function alone with the id 6140138 and the name of the respective hotel that is given in the error (Here its Vital Hotel Fulya..) I get the expected result in the terminal
I really don’t know what’s happening
Homepage.urls
app_name='Homepage'
urlpatterns = [
path('',views.hotels_generator,name='hotels_generator'),
path('Book_now/<id_hotel>/<name>/<add>',views.book_now,name='book_now'),
path('logging_out/',views.log_out,name='logout'),
path('AboutUs/',views.about_us,name='AboutUs'),
path('contact/',views.contact_us,name='contact')
]
Homepage.views
def hotels_generator(request):
if request.method=='POST':
start_date=request.POST.get("trip-start")
end_date=request.POST.get("trip-end")
if start_date>end_date or start_date<str(datetime.date(datetime.now())) or end_date<str(datetime.date(datetime.now())):
return render(request,'Homepage/homepage.html',{'l':['error']})
destination=request.POST.get("Destination")
nb_adults=request.POST.get("numofadults")
nb_kids=request.POST.get("numofkids")
location=name.geocode(destination)
latitude=location.latitude
longitude=location.longitude
url = "https://booking-com.p.rapidapi.com/v1/hotels/search-by-coordinates"
querystring = {"checkin_date":start_date,"order_by":"popularity","units":"metric","longitude":longitude,"adults_number":nb_adults,"latitude":latitude,"room_number":"1","locale":"en-gb","filter_by_currency":"USD","checkout_date":end_date,"children_number":nb_kids,"children_ages":"5,0","page_number":"0","categories_filter_ids":"class::2,class::4,free_cancellation::1","include_adjacency":"true"}
if nb_kids=='':
querystring.pop('children_number')
headers = {
'x-rapidapi-host': "booking-com.p.rapidapi.com",
'x-rapidapi-key': "42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003"
}
response = requests.request("GET", url, headers=headers, params=querystring)
info=json.loads(response.text)
l=[]
for i in range(0,len(info['result'])):
dict={}
dict['Hotel_name']=info['result'][i]['hotel_name']
dict['hotel_city']=info['result'][i]['city_trans']
dict['hotel_address']=info['result'][i]['address_trans']
dict['price']=str(info['result'][i]['price_breakdown']['gross_price'])+' '+info['result'][i]['currencycode']
dict['image_url']=str(info['result'][i]['max_photo_url'])
dict['id_Hotel']=str(info['result'][i]['id'][14:])
l.append(dict)
return render(request,'Homepage/Template.html',{'l':l})
else:
return render(request,'Homepage/homepage.html')
def book_now(request,id_hotel,name,add):
print('suiwer')
Hotel_landmarks=[]
url_landmarks = "https://booking-com.p.rapidapi.com/v1/hotels/nearby-places"
querystring1= {"locale":"en-gb","hotel_id":id_hotel}
headers1 = {
'x-rapidapi-host': "booking-com.p.rapidapi.com",
'x-rapidapi-key': "42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003"
}
response1 = requests.request("GET", url_landmarks, headers=headers1, params=querystring1)
info=json.loads(response1.text)
for i in info['landmarks']['closests']:
Hotel_landmarks.append(i['landmark_name']+' '+str(i['distance'])+' m')
hotel_images_url=[]
url_images = "https://booking-com.p.rapidapi.com/v1/hotels/photos"
querystring2 = {"locale":"en-gb","hotel_id":id_hotel}
headers2 = {
"X-RapidAPI-Host": "booking-com.p.rapidapi.com",
"X-RapidAPI-Key": '42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003'
}
response2 = requests.request("GET", url_images, headers=headers2, params=querystring2)
response2=json.loads(response2.text)
for i in response2:
hotel_images_url.append(i['url_max'])
url_desc = "https://booking-com.p.rapidapi.com/v1/hotels/description"
querystring3 = {"hotel_id":id_hotel,"locale":"en-gb"}
headers3 = {
"X-RapidAPI-Host": "booking-com.p.rapidapi.com",
"X-RapidAPI-Key": '42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003'
}
response3 = requests.request("GET", url_desc, headers=headers3, params=querystring3)
response3=json.loads(response3.text)
hotel_desc=response3['description']
liste_of_monuments=[]
url4 = "https://booking-com.p.rapidapi.com/v1/hotels/nearby-places"
querystring4 = {"locale":"en-gb","hotel_id":id_hotel}
headers4 = {
'x-rapidapi-host': "booking-com.p.rapidapi.com",
'x-rapidapi-key': '42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003'
}
response4 = requests.request("GET", url4, headers=headers4, params=querystring4)
info=json.loads(response4.text)
for i in info['landmarks']['populars']:
liste_of_monuments.append(i['landmark_name']+' '+str(i['distance'])+' m')
print('siuiu')
return render(request,'Homepage/Hotels_page.html',{'l':Hotel_landmarks,'name':name,'add':add,'img':hotel_images_url,'desc':hotel_desc,'l2':liste_of_monuments})
Template.html
<!DOCTYPE html>
<html>
<head>
<title>Hotels</title>
{% load static %}
<link rel="stylesheet" href="{% static 'Template.css' %}">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<section class="packages" id="packages">
<div class="box-container">
{% for i in l %}
<div class="box">
<img src="{{i.image_url}}">
<div class="content">
<div><h2>{{i.Hotel_name}}, {{i.hotel_city}}</h2></div>
<h4>{{i.hotel_address}}<br><br></h4>
<div class="boxxx">
<div></div>
<div></div>
<div class="price"><span>{{i.price}}</span></div>
</div>
<br>
<a href="#"><button style="height: 50px; width: 250px">View on map</button></a>
<a href="{% url 'Homepage:book_now' id_hotel=i.id_Hotel name=i.Hotel_name add=i.hotel_address %}"><button style="height: 50px; width: 250px;padding-left:30px;">Book Now</button></a>
</div>
</div>
<script>
let ratings=1;
document.getElementById("demo").innerHTML = ratings;
</script>
<br><br>
{% endfor %}
</div>
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
In that case, the address section of the query is causing the issue I think. You may need to update your regex to include special characters like ÇŞİ
ie.
(?:[A-Z]|[ŞİÇ])
or your regex could be more inclusive by accepting any character
ie.
book_now/{id_hotel}/.*/
feel free to test out your new regex here https://regex101.com/
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0
