Django路由传token时报ChangeEmailView() unexpected keyword argument错误如何解决
问题解决方法
错误原因
路由中配置了<str:token>路径参数,Django会自动将路径中对应位置的值作为token关键字参数传递给绑定的视图函数,但你的ChangeEmailView函数未声明接收该参数,因此触发参数不匹配错误。
解决步骤
- 第一步:修改
ChangeEmailView函数的参数定义,新增token入参,同时补充token合法性校验逻辑(避免伪造token访问),修改后代码如下:
@login_required(login_url='home:login') def ChangeEmailView(request, token): # 先校验传入的token是否属于当前用户且未被使用 packet = get_object_or_404(TempUrl, user=request.user, uid=token, used=False) if request.method == 'POST': objects = User.objects.get(email = request.user.email) form = EmailChangingForm(request.POST, instance=objects) if form.is_valid(): form.save() # 修改邮箱成功后标记token为已使用,防止重复调用 packet.used = True packet.save() return redirect('home:profilesettings') else: objects = User.objects.get(email = request.user.email) # 修正原代码问题:GET请求初始化表单不需要传入request.POST,避免触发非预期校验 form = EmailChangingForm(instance=objects) context = {'form': form, 'token': token} return render(request, 'home/email_settings.html', context)
- 第二步:优化路由配置(可选,符合Django默认路径规范),给路径末尾添加斜杠,避免Django触发自动重定向:
path('settings/email/changeemail/<str:token>/', views.ChangeEmailView , name="changeemail"),
- 第三步:模板中生成跳转链接时正确携带token参数,在
changeemail_pre.html中跳转修改邮箱页的链接写法如下:
<a href="{% url 'changeemail' token=token %}">点击修改邮箱</a>
如果是在视图中生成链接,可以用reverse函数:
from django.urls import reverse url = reverse('changeemail', kwargs={'token': token})
以上修改完成后即可实现携带唯一有效token的修改邮箱URL功能,同时保证访问合法性。
内容的提问来源于stack exchange,提问作者FLYAX
相关产品推荐
相关产品推荐

