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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:45:04