Django酒店预订网站部分城市出现NoReverseMatch错误求助
解决Django中
NoReverseMatch错误:含特殊字符的URL参数问题 我一眼就看出问题所在了——你遇到的NoReverseMatch错误,根源是部分酒店的名称或地址包含了斜杠(/)这类会干扰URL路径解析的特殊字符,比如错误案例里的地址:FULYA MAH. MEHMETÇİK CAD. NO: 61 İÇ KAPI NO: 3 ŞİŞLİ/İSTANBUL ,里面的ŞİŞLİ/İSTANBUL带了斜杠,这会让Django把这个斜杠当成URL路径的分隔符,导致实际生成的URL分段数超出了你定义的3段(id_hotel/name/add),自然匹配不上book_now的URL模式。
而迪拜、马德里等地的酒店信息里没有这类特殊字符,所以一切正常。下面给你两个解决方案,优先推荐第一个:
方案一:优化URL设计,仅传递酒店ID(推荐)
酒店ID是唯一标识,完全可以通过ID重新获取名称、地址等信息,没必要把这些易变且含特殊字符的内容塞进URL里,这是最安全简洁的处理方式。
1. 修改URL配置(Homepage/urls.py)
只保留id_hotel参数:
app_name='Homepage' urlpatterns = [ path('',views.hotels_generator,name='hotels_generator'), # 简化URL,仅传递酒店ID path('Book_now/<id_hotel>/',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') ]
2. 更新book_now视图函数(Homepage/views.py)
调整参数,通过酒店ID调用API获取名称和地址:
def book_now(request, id_hotel): # 先通过ID获取酒店基础信息(名称、地址) url_hotel_details = "https://booking-com.p.rapidapi.com/v1/hotels/data" querystring = {"locale":"en-gb","hotel_id":id_hotel} headers = { 'x-rapidapi-host': "booking-com.p.rapidapi.com", 'x-rapidapi-key': "42dbab23b1msh23693ff3dc47fa2p1e3cbdjsn11dce8163003" } response_details = requests.request("GET", url_hotel_details, headers=headers, params=querystring) hotel_details = json.loads(response_details.text) name = hotel_details['hotel_name'] add = hotel_details['address_trans'] # 以下是你原来获取地标、图片、描述的逻辑,保持不变 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') 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})
3. 调整模板调用(Template.html)
简化URL生成,只传酒店ID:
<a href="{% url 'Homepage:book_now' id_hotel=i.id_Hotel %}"><button style="height: 50px; width: 250px;padding-left:30px;">Book Now</button></a>
方案二:对URL参数编码(不推荐,仅作备选)
如果你坚持要把名称和地址放在URL里,可以用urlencode过滤器编码参数,但这只能处理空格、特殊字符,无法解决斜杠(/)的问题——因为%2F会被浏览器解码成/,依然会破坏URL路径结构。
模板修改示例:
<a href="{% url 'Homepage:book_now' id_hotel=i.id_Hotel name=i.Hotel_name|urlencode add=i.hotel_address|urlencode %}"><button style="height: 50px; width: 250px;padding-left:30px;">Book Now</button></a>
这种方式风险高,容易出现其他匹配问题,不建议使用。
内容的提问来源于stack exchange,提问作者J code
相关产品推荐
相关产品推荐

