Django多用户应用报错:intern_profile_view缺少request参数求助
问题分析与修复方案
1. 核心错误:装饰器使用不当
@method_decorator是Django专为类视图设计的装饰器,不能直接用于函数视图。你的视图是函数类型,直接叠加使用@login_required和@intern_required即可:
修改后的视图装饰部分:
@login_required @intern_required def intern_profile_view(request): # 原有视图逻辑
2. 表单初始化逻辑错误
当前代码在POST表单验证失败时,会重新初始化空表单,导致用户输入内容和错误提示全部丢失。正确逻辑是:仅在GET请求时初始化空表单,POST请求无论验证是否通过,都保留当前表单实例(失败时保留错误信息):
修改后的完整视图逻辑:
@login_required @intern_required def intern_profile_view(request): # GET请求或首次加载时初始化空表单 user_form = InternSignUpForm(prefix='UF') profile_form = InternProfileForm(prefix='PF') if request.method == 'POST': user_form = InternSignUpForm(request.POST, prefix='UF') profile_form = InternProfileForm(request.POST, prefix='PF') if user_form.is_valid() and profile_form.is_valid(): user = user_form.save(commit=False) user.save() # 确保InternProfile实例存在,避免AttributeError intern_profile, created = InternProfile.objects.get_or_create(user=user) intern_profile.bio = profile_form.cleaned_data.get('bio') intern_profile.location = profile_form.cleaned_data.get('location') intern_profile.save() return render(request, 'interns/intern_profile.html',{ 'user_form': user_form, 'profile_form': profile_form, })
3. 潜在问题:OneToOneField实例未创建
你的InternProfile模型中user字段设为null=True,但新用户创建后user.intern_profile可能尚未生成,直接赋值会触发AttributeError。使用get_or_create可以确保实例存在,无论是否是首次创建。
额外检查项
- 确认
intern_required装饰器实现正确,能准确识别实习生用户 - 检查模板中表单字段是否正确使用了
UF-和PF-前缀
内容的提问来源于stack exchange,提问作者mdaw11
相关产品推荐
相关产品推荐

