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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:15:32