ข้อผิดพลาด NoReverseMatch คืออะไรและฉันจะแก้ไขได้อย่างไร


119

ฉันมีรหัสบางอย่างและเมื่อดำเนินการมันจะพ่น NoReverseMatch โดยพูดว่า:

ไม่พบ NoReverseMatch ที่ / my_url / Reverse สำหรับ "my_url_name" ที่มีอาร์กิวเมนต์ "()" และอาร์กิวเมนต์คำหลัก "{}" n รูปแบบที่พยายาม: []

นี่หมายความว่าอย่างไรและฉันจะทำอะไรได้บ้าง?

คำตอบ:


243

NoReverseMatchข้อผิดพลาดจะบอกว่า Django ไม่สามารถหารูปแบบการจับคู่ URL สำหรับ URL ที่คุณได้ให้ในใด ๆ ของ URL ที่ติดตั้งแอปของคุณ

ข้อยกเว้น NoReverseMatch ถูกยกขึ้นโดย django.core.urlresolvers เมื่อไม่สามารถระบุ URL ที่ตรงกันใน URLconf ของคุณตามพารามิเตอร์ที่ให้มา

ในการเริ่มต้นการดีบักคุณต้องเริ่มต้นด้วยการตัดข้อความแสดงข้อผิดพลาดที่ให้ไว้กับคุณ

  • NoReverseMatch ที่ / my_url /

    นี่คือ url ที่กำลังแสดงผลเป็น url ที่แอปพลิเคชันของคุณพยายามเข้าถึงอยู่ในขณะนี้ แต่มี url ที่ไม่สามารถจับคู่ได้

  • ย้อนกลับสำหรับ 'my_url_name'

    นี่คือชื่อของ url ที่ไม่สามารถค้นหาได้

  • ด้วยอาร์กิวเมนต์ '()' และ

    นี่คืออาร์กิวเมนต์ที่ไม่ใช่คีย์เวิร์ดซึ่งมีให้กับ url

  • ไม่พบอาร์กิวเมนต์คำหลัก "{}"

    นี่คืออาร์กิวเมนต์คำหลักที่ให้ไว้ใน url

  • n รูปแบบที่พยายาม: []

    นี่คือรูปแบบที่สามารถพบได้ในไฟล์ urls.py ของคุณที่พยายามจับคู่

เริ่มต้นด้วยการค้นหารหัสในแหล่งที่มาของคุณที่เกี่ยวข้องกับ url ที่กำลังแสดงอยู่ - URL มุมมองและเทมเพลตที่เกี่ยวข้อง ในกรณีส่วนใหญ่จะเป็นส่วนหนึ่งของโค้ดที่คุณกำลังพัฒนาอยู่

เมื่อคุณทำเสร็จแล้วให้อ่านโค้ดตามลำดับที่ django จะติดตามจนกว่าคุณจะไปถึงบรรทัดของโค้ดที่พยายามสร้าง url สำหรับmy_url_nameไฟล์. อีกครั้งนี่อาจอยู่ในสถานที่ที่คุณเพิ่งเปลี่ยนไป

เมื่อคุณพบว่าเกิดข้อผิดพลาดแล้วให้ใช้ส่วนอื่น ๆ ของข้อความแสดงข้อผิดพลาดเพื่อแก้ไขปัญหา

ชื่อ URL

  • มีพิมพ์ผิดหรือเปล่า
  • คุณได้ระบุ url ที่คุณพยายามเข้าถึงชื่อนี้หรือไม่?
  • หากคุณตั้ง app_name ไว้ในurls.py(เช่นapp_name = 'my_app') ของแอปหรือหากคุณรวมแอปด้วยเนมสเปซ (เช่นinclude('myapp.urls', namespace='myapp')คุณต้องรวมเนมสเปซเมื่อย้อนกลับเช่น{% url 'myapp:my_url_name' %}หรือreverse('myapp:my_url_name').

อาร์กิวเมนต์และอาร์กิวเมนต์คำหลัก

อาร์กิวเมนต์และอาร์กิวเมนต์คำหลักถูกใช้เพื่อจับคู่กับกลุ่มการดักจับใด ๆ ที่มีอยู่ภายใน URL ที่กำหนดซึ่งสามารถระบุได้โดย()วงเล็บโดยรอบในรูปแบบ URL

สมมติว่า url ที่คุณจับคู่ต้องการอาร์กิวเมนต์เพิ่มเติมให้ดูในข้อความแสดงข้อผิดพลาดและก่อนอื่นให้ดูว่าค่าของอาร์กิวเมนต์ที่ระบุนั้นถูกต้องหรือไม่

หากไม่ถูกต้อง:

  • ไม่มีค่าหรือสตริงว่างเปล่า

    โดยทั่วไปหมายความว่าค่าที่คุณส่งผ่านไม่มีค่าที่คุณคาดหวัง ดูตำแหน่งที่คุณกำหนดค่าให้ตั้งค่าเบรกพอยต์และคุณจะต้องหาสาเหตุว่าทำไมค่านี้จึงไม่ถูกส่งผ่านอย่างถูกต้อง

  • อาร์กิวเมนต์คำหลักมีการพิมพ์ผิด

    แก้ไขสิ่งนี้ในรูปแบบ url หรือใน url ที่คุณกำลังสร้าง

หากถูกต้อง:

  • ดีบัก regex

    คุณสามารถใช้เว็บไซต์เช่นregexrเพื่อทดสอบได้อย่างรวดเร็วว่ารูปแบบของคุณตรงกับ url ที่คุณคิดว่าคุณกำลังสร้างคัดลอกรูปแบบ url ลงในช่อง regex ที่ด้านบนจากนั้นใช้พื้นที่ข้อความเพื่อรวม url ที่คุณคิดว่าเป็น ควรจับคู่กับ

    ข้อผิดพลาดทั่วไป:

    • จับคู่กับ.อักขระตัวแทนหรืออักขระ regex อื่น ๆ

      อย่าลืมหลีกเลี่ยงอักขระเฉพาะด้วย\คำนำหน้า

    • จับคู่เฉพาะกับอักขระตัวพิมพ์เล็ก / ใหญ่

      ลองใช้อย่างใดอย่างหนึ่งa-Zหรือ\wแทนa-zหรือA-Z

  • ตรวจสอบว่ารูปแบบที่คุณจับคู่นั้นรวมอยู่ในรูปแบบที่พยายาม

    หากไม่ได้อยู่ที่นี่อาจเป็นไปได้ว่าคุณลืมรวมแอพของคุณไว้ในการINSTALLED_APPSตั้งค่า (หรือINSTALLED_APPSอาจต้องดูลำดับของแอพภายใน)

เวอร์ชัน Django

ใน Django 1.10 ความสามารถในการย้อนกลับ url โดยพา ธ python ถูกลบออก ควรใช้เส้นทางที่ตั้งชื่อแทน


หากคุณยังไม่สามารถติดตามปัญหาได้โปรดอย่าลังเลที่จะถามคำถามใหม่ซึ่งรวมถึงสิ่งที่คุณได้ลองสิ่งที่คุณค้นคว้า (คุณสามารถเชื่อมโยงไปยังคำถามนี้ได้) จากนั้นใส่รหัสที่เกี่ยวข้องกับ ปัญหา - URL ที่คุณจับคู่รูปแบบ URL ที่เกี่ยวข้องส่วนของข้อความแสดงข้อผิดพลาดที่แสดงสิ่งที่ django พยายามจับคู่และอาจเป็นการINSTALLED_APPSตั้งค่าหากมี


11
ในที่สุดเราก็มีคำตอบที่เป็นที่ยอมรับซึ่งเราสามารถให้เป็นเป้าหมายการ
ปลอมแปลงได้

คุณช่วยอธิบายรายละเอียดเกี่ยวกับเส้นทางที่ตั้งชื่อใน django 1.10 ได้ไหม
sage poudel

2
ใช่set app_name in the app's urls.py (e.g. app_name = 'my_app') ประเด็น
CK

ฉันพบว่าเครื่องทดสอบ regex แบบสดนี้มีประโยชน์มากกว่า: regex101.com
obotezat

ขอบคุณสำหรับบทช่วยสอนที่ยอดเยี่ยมเกี่ยวกับ NoReverseMatch! ฉันสามารถแยกแยะปัญหาของฉันได้
newmachines_xyz

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.