Django个人页面出现TypeError错误:__init__参数不匹配求助
Django类视图访问报错:TypeError: init() takes 1 positional argument but 2 were given
问题根源
你的urls.py中,personalpage路径对应的视图是类PersonalPage,但没有调用.as_view()方法。Django的基于类的视图(CBV)必须通过.as_view()方法将类转换为可被Django调用的视图函数,直接传入类的话,Django会尝试实例化类并传入request参数,而类的默认__init__方法只接受self一个参数,因此触发该错误。
修复代码
修改urls.py中personalpage的路径配置:
urlpatterns = [ path('', Main.as_view(), name='home'), path('registration/', views.Registration, name='registration'), path('signin/', views.Signin, name='signin'), path('signout/', views.Signout, name='signout'), # 新增.as_view()方法调用 path('personalpage/', views.PersonalPage.as_view(), name='personalpage'), ]
额外优化建议
1. 给个人页面添加登录保护
个人页面属于用户私密内容,应该限制仅登录用户访问,可通过LoginRequiredMixin实现:
# 在views.py顶部导入 from django.contrib.auth.mixins import LoginRequiredMixin class PersonalPage(LoginRequiredMixin, TemplateView): template_name = 'emnosys/personalpage.html' login_url = 'signin' # 未登录时跳转至登录页 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['css_file'] = 'styles.css' # 将当前登录用户信息传入模板 context['current_user'] = self.request.user return context
同时修改HTML模板,显示真实用户信息:
<div class="username"> <label for="username">Name</label> {{ current_user.username }} </div> <div class="email"> <label for="email">Email</label> {{ current_user.email }} </div>
2. 修复静态文件引用方式
模板中不要使用相对路径引用静态文件,改用Django的static模板标签:
<!-- 在HTML头部添加标签加载 --> {% load static %} <link rel="stylesheet" href="{% static 'emnosys/css/styles-personalpage.css' %}"> <!-- 替换图片引用 --> <img src="{% static 'emnosys/images/waves.png' %}" alt="waves">
3. 完善表单验证逻辑
给注册、登录添加基础验证和错误提示:
# 修改Registration视图 def Registration(request): if request.method == "POST": username = request.POST['username'] email = request.POST['email'] password1 = request.POST['password1'] password2 = request.POST['password2'] # 密码一致性校验 if password1 != password2: messages.error(request, "两次输入的密码不一致") return redirect('registration') # 用户名唯一性校验 if User.objects.filter(username=username).exists(): messages.error(request, "该用户名已被注册") return redirect('registration') # 邮箱唯一性校验 if User.objects.filter(email=email).exists(): messages.error(request, "该邮箱已被注册") return redirect('registration') myuser = User.objects.create_user(username, email, password1) myuser.save() messages.success(request, "注册成功,请登录") return redirect('signin') return render(request, "emnosys/registration.html") # 修改Signin视图 def Signin(request): if request.method == 'POST': username = request.POST['username'] password1 = request.POST['pass1'] user = authenticate(username=username, password=password1) if user is not None: login(request, user) messages.success(request, "登录成功") return redirect('personalpage') # 登录后直接跳转个人页 else: messages.error(request, "用户名或密码错误") return redirect('signin') return render(request, "emnosys/signin.html")
在模板中添加消息展示区域(可放在页面顶部):
{% if messages %} {% for message in messages %} <div class="message-{{ message.tags }}"> {{ message }} </div> {% endfor %} {% endif %}
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

