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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:27:45