首页 > 解决方案 > 为什么当我使用 PasswordChangeForm 时 is_valid 返回 None?我完全确定我输入的凭据是正确的

问题描述

当我尝试提交表单时,它会抛出一个 ValueError。下面是我的代码。

def passchange(request):
    if request.user.is_authenticated:
        if request.method == "POST":
            print(request.POST)
            fm = PasswordChangeForm(user=request.user, data=request.POST)
            print(fm)
            if fm.is_valid():
                fm.save()
                update_session_auth_hash(request, fm.user)
                messages.success(request, 'Password Changed Successfully')
                if fm.user.location=="Latur":
                    return HttpResponseRedirect('/laturhome/')
                elif fm.user.location=="Nashik":
                    return HttpResponseRedirect('/nashikhome/')
                elif fm.user.location=="Dhule":
                    return HttpResponseRedirect('/dhulehome/')
                elif fm.user.location=="Akola":
                    return HttpResponseRedirect('/akolahome/')
                elif fm.user.location=="Solapur":
                    return HttpResponseRedirect('/solapurhome/')
            else:
                print(fm.error_messages)
                return HttpResponse('Not valid')
        else:
            fm = PasswordChangeForm(user=request.user)
            return render(request, 'account/passchange.html', {'form':fm})
    else:
        return HttpResponseRedirect('/login/')

终端显示如下: {'password_mismatch': '两个密码字段不匹配。', 'password_incorrect': '您的旧密码输入错误。请重新输入。'}

还有我的模板:

<form action="" method="post" novalidate>
        {% csrf_token %}
        {% if form.non_field_errors %}
          {% for error in form.non_field_errors %}
             <p>{{ error }}</p>
          {% endfor %}
        {% endif %}
      
        {% for fm in form %}
         {{fm.label_tag}} {{fm}} {{fm.errors|striptags}} <br> <br>
        {% endfor %}
        <input type="submit" value="Save">
       </form>
       <a href="{% url 'logout' %}">Logout</a>

我哪里做错了?它是否与我创建了自定义用户模型而不使用 django 用户模型有关?is_valid 函数有替代品吗?我可以在这里写我自己的验证吗?

Traceback Switch to copy-and-paste view
C:\Users\pande\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\exception.py, line 47, in inner
                response = get_response(request) …
▼ Local vars
Variable    Value
exc 
ValueError("The view account.views.passchange didn't return an HttpResponse object. It returned None instead.")
get_response    
<bound method BaseHandler._get_response of <django.core.handlers.wsgi.WSGIHandler object at 0x000001B4A0A297F0>>
request 
<WSGIRequest: POST '/passchange/'>
C:\Users\pande\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py, line 188, in _get_response
        self.check_response(response, callback) …
▼ Local vars
Variable    Value
callback    
<function passchange at 0x000001B4A10E5820>
callback_args   
()
callback_kwargs 
{}
middleware_method   
<bound method CsrfViewMiddleware.process_view of <django.middleware.csrf.CsrfViewMiddleware object at 0x000001B4A0A9DD30>>
request 
<WSGIRequest: POST '/passchange/'>
response    
None
self    
<django.core.handlers.wsgi.WSGIHandler object at 0x000001B4A0A297F0>
wrapped_callback    
<function passchange at 0x000001B4A10E5820>
C:\Users\pande\AppData\Local\Programs\Python\Python39\lib\site-packages\django\core\handlers\base.py, line 309, in check_response
            raise ValueError( …
▼ Local vars
Variable    Value
callback    
<function passchange at 0x000001B4A10E5820>
name    
'The view account.views.passchange'
response    
None
self    
<django.core.handlers.wsgi.WSGIHandler object at 0x000001B4A0A297F0>

标签: djangodjango-viewsdjango-forms

解决方案


推荐阅读