You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django账号删除功能异常:输入随机确认字符串始终不匹配

Django账号删除验证失败问题解决

核心问题

问题根源在于每次请求settings视图时都会重新生成confirmation随机字符串:

  • 用户通过GET请求加载页面时,生成一个字符串并传给模板显示;
  • 用户提交POST请求时,视图会再次生成全新的字符串,此时拿新字符串和用户输入的旧字符串对比,自然永远不相等。

解决方案

利用Django的session存储随机字符串,session可在同一用户会话的多次请求间保留数据,具体修改如下:

修改views.py

@login_required
def settings(request):
    if request.method == 'POST':
        form = NewDeleteForm(request.POST)
        if form.is_valid():
            # 从session取出之前存储的验证字符串
            stored_confirmation = request.session.get('account_delete_confirmation')
            if form.cleaned_data["confirmation"] == stored_confirmation:
                User.objects.filter(username=request.user.get_username()).update(is_active=False)
                # 验证通过后删除session中的字符串,避免重复使用
                del request.session['account_delete_confirmation']
                return redirect("home")
            else:
                # 给表单添加错误提示,替代直接重定向
                form.add_error('confirmation', '输入的验证字符串不匹配')
    else:
        form = NewDeleteForm()
        # 仅在首次加载页面时生成随机字符串并存入session
        confirmation = ''.join(random.choices(string.ascii_uppercase, k=7))
        request.session['account_delete_confirmation'] = confirmation

    context = {
        'home_act': 'active',
        'contact_act': '',
        'released_act': '',
        'about_act': '',
        'current_act': '',
        'form': form,
        'confirmation': request.session.get('account_delete_confirmation', ''),
    }

    return render(request, 'turtles/settings.html', context)

可选优化:表单自动统一大小写

如果担心用户输入小写字母导致不匹配,可在forms.py中添加clean方法自动转换为大写:

class NewDeleteForm(forms.Form):
    confirmation = forms.CharField(label='Type the letters above to confirm account deletion.')

    def clean_confirmation(self):
        # 将输入内容统一转为大写,匹配生成的字符串格式
        return self.cleaned_data['confirmation'].upper()

内容的提问来源于stack exchange,提问作者Henbeast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:57:28