Django本地URL访问登录页报TypeError 如何实现登录及添加用户
问题根源
你遇到的报错直接原因是urls.py中Django类视图的调用方式错误,另外views.py中还存在表单类误用、函数重复定义的问题,按以下步骤修改即可:
1. 修改urls.py配置
Django的LoginView、LogoutView都属于基于类的视图(CBV),不能直接将类名传入url路由,必须调用类的as_view()方法将其转化为可调用的视图函数,同时模板路径参数需要传入as_view()内:
from django.conf.urls import url from django.contrib.auth.views import LoginView,LogoutView from accounts import views urlpatterns = [ url(r'^$',views.home), # 类视图调用as_view()方法,模板参数传入方法内 url(r'^login/$', LoginView.as_view(template_name='accounts/login.html')), url(r'^logout/$', LogoutView.as_view(template_name='accounts/logout.html')), url(r'^register/$',views.register, name ='register'), url(r'^profile/$',views.view_profile, name ='view_profile'), # 原name有空格,建议修改为下划线格式避免潜在问题 url(r'^profile/edit/$',views.edit_profile , name ='edit_profile'), ]
2. 修改views.py代码
当前views.py存在三个核心问题:
- 重复定义了
edit_profile函数,后定义的会覆盖先定义的逻辑 - 误用了
PasswordChangeDoneView:这是Django内置的密码修改成功后的跳转视图类,不是表单类,密码修改表单应该用你已经导入的PasswordChangeForm PasswordChangeForm实例化时参数顺序错误,第一个入参必须是当前登录用户对象
修改后的完整views.py代码如下:
from django.shortcuts import render,redirect from accounts.forms import NewUserForm from django.contrib.auth.forms import PasswordChangeForm from django.contrib.auth import update_session_auth_hash def home(request): numbers = [1,2,3,4,5] name = 'max' args = {'myName': name,'numbers':numbers} return render(request, 'accounts/home.html',args) def register(request): if request.method == 'POST': form = NewUserForm(request.POST) if form.is_valid(): form.save() return redirect('/account') else: form = NewUserForm() args = {'form':form} return render(request,'accounts/reg_form.html',args) def view_profile(request): args ={'user':request.user} return render(request,'accounts/profile.html',args) def edit_profile(request): if request.method == 'POST': # PasswordChangeForm第一个参数必须是用户对象 form = PasswordChangeForm(user=request.user, data=request.POST) if form.is_valid(): user = form.save() # 保存密码后更新会话,避免用户被强制登出 update_session_auth_hash(request, user) return redirect('/account/profile') else: form = PasswordChangeForm(user=request.user) args={'form':form} return render(request,'accounts/change_password.html',args)
修改完成后重启Django服务,再访问登录地址即可正常加载页面。
内容的提问来源于stack exchange,提问作者panti
相关产品推荐
相关产品推荐

