带有Django 2.0的关键字参数uidb64的NoReverseMatch

我不明白为什么我的代码无法正常工作。在此之前,但现在,当我运行服务器并进行测试时,代码不起作用。

用户注册时,我向他发送激活电子邮件,如下所示:

def send_activation_email(serializer, request, user):

current_site = get_current_site(request)

message = render_to_string('acc_active_email.html', {

'user': user,

'domain': current_site.domain,

'uid': urlsafe_base64_encode(force_bytes(user.pk)),

'token': account_activation_token.make_token(user),

})

mail_subject = 'Activate your blog account.'

to_email = serializer.data['email']

email = EmailMessage(mail_subject, message, to=[to_email])

email.send()

acc_active_email.html

{% autoescape off %}

Hi {{ user.username }},

Please click on the link to confirm your registration,

http://{{ domain }}{% url 'activate' uidb64=uid token=token %}

{% endautoescape %}

和我的网址文件

.

.

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

views.activate_account, name='activate'),

.

.

但是我有这个错误:

Exception Type:     NoReverseMatch

Exception Value:

Reverse for 'activate' with keyword arguments '{'uidb64': b'NDM', 'token': '4qz-8f770502bd8b02786da9'}' not found. 1 pattern(s) tried: ['activate/(?P<uidb64>[0-9A-Za-z_\\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$']

突出显示此行 http://{{ domain }}{% url ‘activate’ uidb64=uid token=token %}

回答:

在Django 2.0和2.1中,你应该decode()在对base64进行编码后调用uid,以将其转换为字符串:

message = render_to_string('acc_active_email.html', {

'user': user,

'domain': current_site.domain,

'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),

'token': account_activation_token.make_token(user),

})

有关更多信息,请参见Django 2.0发行说明中的​​说明。

在Django 2.2+中,urlsafe_base64_encode返回一个string,因此无需解码。

message = render_to_string('acc_active_email.html', {

'user': user,

'domain': current_site.domain,

'uid': urlsafe_base64_encode(force_bytes(user.pk)),

'token': account_activation_token.make_token(user),

})

使用可以编写与Django <1.11、2.0-2.1和2.2+兼容的代码force_text。请注意,以下内容未经测试。

from django.utils.encoding import force_text

message = render_to_string('acc_active_email.html', {

'user': user,

'domain': current_site.domain,

'uid': force_text(urlsafe_base64_encode(force_bytes(user.pk))),

'token': account_activation_token.make_token(user),

})

force_text删除对Django <2.2的支持后,你可以删除和使用第二个代码片段。

以上是 带有Django 2.0的关键字参数uidb64的NoReverseMatch 的全部内容, 来源链接: utcz.com/qa/416016.html

回到顶部