#django #django-urls
Вопрос:
Я написал представление для регистрации пользователя, включая проверку электронной почты. Однако, как только представление попытается отобразить шаблон почты, оно сломается из-за приведенной ниже ошибки.
Я даже не понимаю саму ошибку. Мы были бы признательны за понимание. Согласно некоторым поискам в Гугле, может быть, uid
это не строка?
NoReverseMatch в /регистрация/ Обратный для «активировать» с аргументами ключевого слова » {«uidb64»: «MTE», «токен»: «asnwwr-550108ae10aa04da212561866c8d1ae3″}» не найден. 1 шаблон(ы) попробовал: [‘активировать/(?P[0-9A-Za-z_-] )/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$’]
Шаблон почты
{% autoescape off %}
Hi {{ user.username }},
Please click on the link below to confirm your registration:
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
Вид
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
subject = 'Activate your Poller Account'
message = render_to_string('userprofile/account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)), # Issue might sit here?
'token': account_activation_token.make_token(user),
})
user.email_user(subject, message)
return redirect('account_activation_sent')
Знак
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) six.text_type(timestamp)
six.text_type(user.email_confirmed)
)
account_activation_token = AccountActivationTokenGenerator()
URL-адрес
url(r'^account_activation_sent/
Комментарии:
1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла
2. @shahbazahmad сделал спасибо
Ответ №1:
Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:
r'^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,32})/
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!
, signup_views.account_activation_sent, name='account_activation_sent'),
url(r'^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/
Комментарии:
1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла
2. @shahbazahmad сделал спасибо
Ответ №1:
Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!
, signup_views.activate, name='activate'),
Комментарии:
1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла
2. @shahbazahmad сделал спасибо
Ответ №1:
Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!
# Change to 32 ^^
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!
, signup_views.account_activation_sent, name=’account_activation_sent’),
url(r’^activate/(?P<uidb64>[0-9A-Za-z_-] )/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/
Комментарии:
1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла
2. @shahbazahmad сделал спасибо
Ответ №1:
Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!
, signup_views.activate, name=’activate’),
Комментарии:
1. вы передаете uidb64 и токен в виде кваргов в файле шаблона, но ваш URL принимает аргументы . Поделиться urls.py код файла
2. @shahbazahmad сделал спасибо
Ответ №1:
Похоже, ошибка возникла из-за того, что ваш токен содержит 32 символа, но регулярное выражение ожидает только до 20. Попробуйте изменить регулярное выражение на:
Комментарии:
1. это сработало, спасибо. Быстрый вопрос: Не повредит ли мне, если я увеличу, скажем, до 50 или около того, чтобы снова избежать этого конфликта, или приведенная выше логика генерации токенов такова, что она всегда будет предоставлять токен с 32 символами?
2. Это зависит от токена, который вы генерируете. Может ли он иметь произвольную длину?
3. tbh idk, тогда вам придется проверить документ PasswordResetTokenGen. Еще раз спасибо!