2012-06-21 24 views
17

Tôi gặp sự cố khi nhận mật khẩu_Reset_confirm bit hoạt động.NoReverseMatch trên password_Reset_confirm

url:

(r'^password_reset/$', 'django.contrib.auth.views.password_reset'), 
(r'^password_reset_done/$', 'django.contrib.auth.views.password_reset_done'), 
(r'^password_reset_confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm'), 

password_reset_email.html, điều này bao gồm:

{% load url from future %} 
Someone asked for password reset for email {{ email }}. Follow the link below: 
{{ protocol}}://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %} 

Nhưng rồi sau khi nộp email của tôi cho Reseting mật khẩu, tôi nhận được thông báo lỗi này cho thấy:

NoReverseĐóng tại/password_reset/Đảo ngược cho 'password_reset_confirm' với đối số '()' và đối số từ khóa '{' uidb36 ':' 1 ',' mã thông báo ':' 38d-b5ec0b2a2321f522f954 '}' không tìm thấy.

Tôi nghĩ vì điều này đang sử dụng xây dựng trong tầm nhìn, tôi sẽ không phải quan tâm đến bất cứ điều gì khác?

Cảm ơn lời khuyên,

Cập nhật:

Sau khi sử dụng đường dẫn đầy đủ, có vẻ như để làm việc. Tuy nhiên nó sẽ gửi hai email ra: và mỗi email có một liên kết khác nhau. Tại sao vậy? Và tôi đặt {{domain}} ở đâu? Cảm ơn

Follow the link below: 
http://example.com/password_reset_confirm/1-38d-b5ec0b2a2321f522f954/ 

Follow the link below: 
http://example.com/password_reset_confirm/2-38d-18482e1f129c84b9c2bc/ 

Cập nhật 2

I figured it out. Chỉ trong trường hợp người khác có vấn đề này. Bạn cần phải thiết lập tên miền của bạn như là trang web cho ứng dụng của bạn:

Trong Quản trị hoặc django console:

>>> my_site = Site.objects.get(pk=1) 
>>> my_site.domain = 'somedomain.com' 
>>> my_site.name = 'Some Domain' 
>>> my_site.save() 

Vấn đề khác khiến bạn có thể nhận được hai email khi đặt lại nó, là bởi vì bạn có thể có nhiều tên người dùng được liên kết với cùng một địa chỉ email. Nó khá ngớ ngẩn. Đây là điều tiếp theo tôi phải giải quyết.

+3

tôi nghĩ rằng bạn đang giả sử để chỉ định tên của màn hình thay vì tên của url. Một cái gì đó như '{% url 'django.contrib.auth.views.password_reset_confirm' ...%}' –

+0

Có điều đó đã làm việc. Lạ lùng, bởi vì tôi đã sao chép từ tài liệu Django. Bây giờ có hai vấn đề còn lại, xin vui lòng xem câu hỏi cập nhật. Cảm ơn bạn – Houman

+0

Cesar, tôi đã khắc phục hai vấn đề khác và cập nhật câu hỏi. Nếu bạn muốn đặt bình luận của bạn như một câu trả lời và tôi sẽ đánh dấu nó là câu trả lời. Cảm ơn – Houman

Trả lời

4

Khi sử dụng thẻ mẫu url, bạn cần chỉ định chế độ xem chứ không phải chính url. Vì bạn đang sử dụng 'django.contrib.auth.views.password_reset_confirm' trong URLconf của bạn, bạn nên sử dụng nó như thế này:

{% url 'django.contrib.auth.views.password_reset_confirm' ... %} 

Thông tin thêm về các url mẫu thẻ trên tài liệu Built-in template tags and filters của Django.

0

Đây có thể là chế độ xem được tích hợp sẵn nhưng bạn vẫn cần URL cho nó. Bạn nên xác định một trong urls.py và liên kết nó với chế độ xem password_reset_confirm.

+0

Tôi đã xác định url cho nó rồi, xem ở trên .. (Trừ khi tôi hiểu lầm bạn) Giải pháp từ Cesar hoạt động thực sự. Nhưng bây giờ tôi chưa hoàn toàn ở đó. Chỉ cần cập nhật câu hỏi. Cảm ơn bạn – Houman

9

Để vượt qua một url vào url mẫu thẻ, bạn có thể chỉ định một name để url trong urls.py

url(r'^reset/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', 
views.password_reset_confirm, name='password_reset_confirm'), 

và sau đó bạn có thể sử dụng thẻ với tên url

{% url 'password_reset_confirm' uidb64=uid token=token %} 
0

Chỉ cần sao chép URL này vào tệp urls.py chính của bạn, để nó nhận ra tên URL

url (r '^ reset/(? P [0-9A-Za-z _-] +)/(? P [0-9A-Za-z] {1,13} - [0-9A-Za- z] {1,20})/$', 'django.contrib.auth.views.password_reset_confirm', name = 'password_reset_confirm'),

Các vấn đề liên quan