Я использую API-интерфейс Django REST Framework для связи из моего интерфейса AngularJS с бэкэндом Django, который работает очень хорошо. Я установил супер полезный пакет django-rest-auth, а также добавила дополнительную регистрацию. Аутентификация работает, и регистрация в основном работает.Django REST auth: ошибка рендеринга django-allauth шаблон после подтверждения по электронной почте
Моя проблема заключается в том, что ссылка подтверждения в электронном письме с подтверждением, отправленном новому пользователю, дает мне ошибку NoReverseMatch. Благодаря django-rest-auth FAQ, я знаю, что подтверждение не работает по умолчанию и требует переопределения, но я отразил то, что сделал плакат this. Мои URLs:
from allauth.account.views import confirm_email as allauthemailconfirmation
...
url(r'^rest-auth/', include('rest_auth.urls')),
url(r'^rest-auth/registration/account-confirm-email/(?P<key>\w+)/$', allauthemailconfirmation, name="account_confirm_email"),
url(r'^rest-auth/registration/', include('rest_auth.registration.urls')),
...
И точная ошибка:
NoReverseMatch at /rest-auth/registration/account-confirm-email/ahhuvpetqmcsd6hjlgrjuru11mwfkpk9sljmfbuprxwz8elnajabr84vusnmdw7r/
Reverse for 'account_email' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
Плакат this вопрос, кажется, была такая же проблема, хотя я не понимаю, как применяется один ответ, и это не принято, поэтому я не уверен, что он даже работает.
EDIT:
На основе первого комментария ниже, я попытался изменить имя URL для account_email
. Это по-прежнему приводит к ошибке, но после повторного прочтения ошибки, я понял, что это брошено во время визуализации шаблона по умолчанию django-allauth
, после того, как вид allauth обработал подтверждение:
Error during template rendering
In template C:\Python34\lib\site-packages\allauth\templates\base.html, error at line 26
Reverse for 'account_email' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []
16 <li>{{message}}</li>
17 {% endfor %}
18 </ul>
19 </div>
20 {% endif %}
21
22 <div>
23 <strong>Menu:</strong>
24 <ul>
25 {% if user.is_authenticated %}
26
<li><a href="
{% url 'account_email' %}
">Change E-mail</a></li>
27 <li><a href="{% url 'account_logout' %}">Sign Out</a></li>
28 {% else %}
29 <li><a href="{% url 'account_login' %}">Sign In</a></li>
30 <li><a href="{% url 'account_signup' %}">Sign Up</a></li>
31 {% endif %}
32 </ul>
33 </div>
34 {% block content %}
35 {% endblock %}
36 {% endblock %}
Так что я думаю, что код я использовал из связанной проблемы github верен для письма с подтверждением, и эта ошибка возникает при визуализации шаблона после того, как allauth-представление подтверждает адрес электронной почты. Я ожидал бы, что URL-адреса в строках 26-30 выше будут частью набора include('rest_auth.registration.urls')
, поскольку в параметре регистрации django-rest-auth используется django-allauth.
Я не уверен, что мне нужно сделать, чтобы этот URL работал, если представление allauth правильно обрабатывает подтверждение. Хотя я мог ошибаться в этом вопросе.
EDIT 2 Я взял совет от комментариев ниже и распечатал все URL-адрес:
>>> show_urls(urls.urlpatterns)
^api/
^$
^\.(?P<format>[a-z0-9]+)/?$
....autogenerated viewset URLs....
^api-browse/
^login/$
^logout/$
^rest-auth/
^password/reset/$
^password/reset/confirm/$
^login/$
^logout/$
^user/$
^password/change/$
^rest-auth/registration/account-confirm-email/(?P<key>[-:\w]+)/$
^rest-auth/registration/
^$
^verify-email/$
^account-confirm-email/(?P<key>\w+)/$
^$
....explicitly added URLs for custom viewset methods...
^register/$
^login/$
^logout$
^admin/
....admin URLs....
Ошибка NoReverseMatch
имеет смысл сейчас, так как шаблоны URL на allauth зрения подтверждения электронной почты просто Арен Нет.
я заметил в связанном StackOverflow вопрос о том, что плакат был включен в allauth URLs, как так:
url(r'^accounts/', include('allauth.urls')),
Когда я добавил эту линию, это сработало!
Разве это не опечатка? В режиме eror он говорит: Reverse для 'account_email', и у вас есть это в url name = "account_confirm_email", можете ли вы попробовать с тем же именем в url? –
Спасибо за идею. Я думаю, что это должно быть 'account_confirm_email' и что этот NoReverseMatch происходит от URL-адреса на базовом шаблоне django-allauth, который не имеет обратного. Я добавил некоторые детали к исходному сообщению, изложив все это. – dkhaupt
Я не понимаю, почему вы получили ошибку, но я могу дать другую идею, чтобы отладить это, проверить шаблоны url с помощью команды show_urls. Эта команда доступна, если вы устанавливаете [django-extenstions] (http://django-extensions.readthedocs.io) –