Lỗi NoReverseMatch là gì và làm cách nào để khắc phục?


119

Tôi có một số mã và khi nó thực thi, nó sẽ ném NoReverseMatch, nói:

NoReverseMatch tại / my_url / Reverse cho 'my_url_name' với các đối số '()' và các đối số từ khóa '{}' không tìm thấy. n mẫu đã thử: []

Điều này có nghĩa là gì, và tôi có thể làm gì về nó?

Câu trả lời:


243

Các NoReverseMatchlỗi được nói rằng Django không thể tìm thấy một mô hình phù hợp với url cho url bạn đã cung cấp trong bất kỳ url ứng dụng cài đặt của bạn.

Ngoại lệ NoReverseMatch được django.core.urlresolvers nêu ra khi một URL phù hợp trong URLconf của bạn không thể được xác định dựa trên các tham số được cung cấp.

Để bắt đầu gỡ lỗi, bạn cần bắt đầu bằng cách loại bỏ thông báo lỗi được cung cấp cho bạn.

  • NoReverseMatch tại / my_url /

    Đây là url hiện đang được hiển thị, đây là url mà ứng dụng của bạn hiện đang cố truy cập nhưng nó chứa một url không thể phù hợp

  • Đảo ngược cho 'my_url_name'

    Đây là tên của url mà nó không thể tìm thấy

  • với các đối số '()' và

    Đây là những đối số không phải từ khóa mà nó cung cấp cho url

  • đối số từ khóa '{}' không tìm thấy.

    Đây là các đối số từ khóa mà nó cung cấp cho url

  • n mẫu đã thử: []

    Đây là những mẫu mà nó có thể tìm thấy trong các tệp urls.py của bạn mà nó đã cố khớp với

Bắt đầu bằng cách định vị mã trong nguồn của bạn có liên quan đến url hiện đang được hiển thị - url, chế độ xem và bất kỳ mẫu nào có liên quan. Trong hầu hết các trường hợp, đây sẽ là một phần của mã bạn đang phát triển.

Khi bạn đã hoàn thành việc này, hãy đọc mã theo thứ tự django sẽ theo dõi cho đến khi bạn đạt được dòng mã đang cố gắng tạo một url cho mã của bạn my_url_name. Một lần nữa, đây có lẽ là một nơi bạn đã thay đổi gần đây.

Bây giờ bạn đã phát hiện ra lỗi xảy ra ở đâu, hãy sử dụng các phần khác của thông báo lỗi để khắc phục sự cố.

Tên url

  • Có lỗi chính tả nào không?
  • Bạn đã cung cấp url bạn đang cố truy cập vào tên đã cho chưa?
  • Nếu bạn đã đặt app_name trong ứng dụng urls.py(ví dụ app_name = 'my_app') hoặc nếu bạn đã bao gồm ứng dụng với một không gian tên (ví dụ: include('myapp.urls', namespace='myapp')thì bạn cần bao gồm không gian tên khi đảo ngược, ví dụ {% url 'myapp:my_url_name' %}hoặc reverse('myapp:my_url_name').

Đối số và đối số từ khóa

Các đối số và đối số từ khóa được sử dụng để khớp với bất kỳ nhóm bắt giữ nào có trong url đã cho có thể được xác định bởi các ()dấu ngoặc xung quanh trong mẫu url.

Giả sử url bạn phù hợp yêu cầu các đối số bổ sung, hãy xem thông báo lỗi và trước tiên hãy xem giá trị của các đối số đã cho có vẻ chính xác hay không.

Nếu họ không đúng:

  • Giá trị bị thiếu hoặc một chuỗi trống

    Điều này thường có nghĩa là giá trị bạn chuyển vào không chứa giá trị mà bạn mong đợi. Hãy xem nơi bạn gán giá trị cho nó, đặt điểm dừng và bạn sẽ cần tìm hiểu tại sao giá trị này không được truyền chính xác.

  • Đối số từ khóa có lỗi đánh máy

    Sửa lỗi này trong mẫu url hoặc trong url bạn đang xây dựng.

Nếu họ đúng:

  • Gỡ lỗi regex

    Bạn có thể sử dụng một trang web như regexr để nhanh chóng kiểm tra xem mẫu của bạn có khớp với url bạn nghĩ bạn đang tạo hay không, Sao chép mẫu url vào trường regex ở trên cùng, sau đó sử dụng vùng văn bản để bao gồm bất kỳ url nào mà bạn nghĩ nó nên phù hợp với.

    Lỗi thường gặp:

    • Phù hợp với .nhân vật thẻ hoang dã hoặc bất kỳ nhân vật regex nào khác

      Nhớ thoát các ký tự cụ thể bằng \tiền tố

    • Chỉ khớp với các ký tự chữ thường / chữ hoa

      Hãy thử sử dụng một trong hai a-Zhoặc \wthay vì a-zhoặcA-Z

  • Kiểm tra xem mẫu bạn phù hợp có được bao gồm trong các mẫu đã thử không

    Nếu không có ở đây thì có thể bạn đã quên đưa ứng dụng của mình vào INSTALLED_APPScài đặt (hoặc thứ tự các ứng dụng trong INSTALLED_APPScó thể cần xem xét)

Phiên bản Django

Trong Django 1.10, khả năng đảo ngược url bằng đường dẫn python của nó đã bị xóa. Đường dẫn được đặt tên nên được sử dụng thay thế.


Nếu bạn vẫn không thể theo dõi vấn đề, thì hãy hỏi một câu hỏi mới bao gồm những gì bạn đã thử, những gì bạn đã nghiên cứu (Bạn có thể liên kết với câu hỏi này), sau đó bao gồm mã có liên quan đến vấn đề - url mà bạn khớp, bất kỳ mẫu url nào có liên quan, một phần của thông báo lỗi hiển thị những gì django đã cố khớp và có thể là INSTALLED_APPScài đặt nếu có.


11
Cuối cùng, chúng tôi có một câu trả lời chính tắc mà chúng tôi có thể cung cấp làm mục tiêu
kép

bạn có thể giải thích về con đường được đặt tên trong django 1.10 không?
hiền triết poudel

2
Vâng, set app_name in the app's urls.py (e.g. app_name = 'my_app') là điểm
CK

Tôi thấy trình kiểm tra regex trực tiếp này hữu ích hơn: regex101.com
obotezat

Cảm ơn bạn đã hướng dẫn tuyệt vời này trên NoReverseMatch! Tôi đã có thể sắp xếp vấn đề của tôi.
newmachines_xyz

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.