You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:09:09