Отсутствие обратного соответствия при рендеринге шаблона электронной почты с переменной uid/token

Я написал представление для регистрации пользователя, включая проверку электронной почты. Однако, когда представление пытается отобразить почтовый шаблон, оно ломается из-за следующей ошибки.

Я даже не понимаю саму ошибку. Буду признателен за понимание. Согласно некоторым гуглениям, возможно, uid не является строкой?

NoReverseMatch at /signup/ Реверс для 'activate' с ключевыми аргументами '{'uidb64': 'MTE', 'token': 'asnwwr-550108ae10aa04da212561866c8d1ae3'}' не найден. Проверен 1 шаблон(ы): ['activate/(?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 %}

View

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')

Token

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/$', 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})/$', signup_views.activate, name='activate'),

Похоже, что ошибка возникает из-за того, что ваш токен содержит 32 символа, а regex ожидает только до 20. Попробуйте изменить regex на:

r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,32})/$'
                                                                   # Change to 32 ^^
Вернуться на верх