繁体   English   中英

Django:分配前引用的局部变量“表单”

[英]Django: local variable 'form' referenced before assignment

With the post Proper way to handle multiple forms on one page in Django I tried to create multiple forms in just one template, so when I press just one submit button, it doesn't submit all the forms right away.

我给提交按钮起了一个名字,例如我的第一个表单的 form1_btn。

在我什至可以尝试它是否有效之前,我收到以下错误,即使我在 Else 语句中指定了 request != 'POST 时会发生什么

local variable 'form' referenced before assignment

查看文件

@login_required
def DashboardView(request):

    browser = str(request.user_agent.browser.family)

    user = str(request.user)
    short_user = user[0:7] + "..."

    try:
        radius = request.user.fieldradius
    except FieldRadius.DoesNotExist:
        radius = FieldRadius(user=request.user)

    try:
        font_size = request.user.fontsize
    except FontSize.DoesNotExist:
        font_size = FontSize(user=request.user)

    try:
        change_color = request.user.colors
    except Colors.DoesNotExist:
        change_color = Colors(user=request.user)

    try:
        toggle_settings = request.user.togglesettings
    except ToggleSettings.DoesNotExist:
        toggle_settings = ToggleSettings(user=request.user)

    try:
        page_details = request.user.pagedetails
    except PageDetails.DoesNotExist:
        page_details = PageDetails(user=request.user)

    if request.method == 'POST':
        if 'form1_btn' in request.POST:
            form = FieldForm(request.POST, prefix='form1',
                             instance=Field(user=request.user))
            if form.is_valid():
                obj = form.save(commit=False)
                obj.creator_adress = get_client_ip(request)
                obj.save()
                return redirect('/dashboard#5')

        elif 'form2_btn' in request.POST:
            togglesettings_form = ToggleSettingsForm(
                request.POST, prefix='form2', instance=toggle_settings)
            if togglesettings_form.is_valid():
                togglesettings_form.save()
                return redirect('/dashboard/#panel1')

        elif 'form3_btn' in request.POST:
            radius_form = FieldRadiusForm(
                request.POST, prefix='form3', instance=radius)
            if radius_form.is_valid():
                radius_form.save()
                return redirect('/dashboard')

        elif 'form4_btn' in request.POST:
            change_color_form = ColorsForm(
                request.POST, prefix='form4', instance=change_color)
            if change_color_form.is_valid():
                change_color_form.save()
                return redirect('/dashboard')

        elif 'form5_btn' in request.POST:
            pagedetails_form = PageDetailsForm(
                request.POST, request.FILES, prefix='form5', instance=page_details)
            if pagedetails_form.is_valid():
                pagedetails_form.save()
                return redirect('/dashboard')

        elif 'form6_btn' in request.POST:
            fontsize_form = FontSizeForm(
                request.POST, prefix='form6', instance=font_size)
            if fontsize_form.is_valid():
                fontsize_form.save()
                return redirect('/dashboard')

    else:
        form = FieldForm(prefix='form1')
        togglesettings_form = ToggleSettingsForm(prefix='form2')
        radius_form = FieldRadiusForm(prefix='form3', instance=radius)
        change_color_form = ColorsForm(prefix='form4', instance=change_color)
        pagedetails_form = PageDetailsForm(
            prefix='form5', instance=page_details)
        fontsize_form = FontSizeForm(prefix='form6', instance=font_size)

    return render(request, 'dashboard.html', {'form': form, 'togglesettings_form': togglesettings_form, 'fontsize_form': fontsize_form, 'change_color_form': change_color_form, 'browser': browser, 'short_user': short_user, 'radius_form': radius_form, 'radius': radius, 'pagedetails_form': pagedetails_form})
``

您在else语句中定义form ,并且在try-except-else之外rendering表单,因此找不到form实例。 我认为您是在else语句中呈现表单,所以只需在else语句中返回即可。

else:
    form = FieldForm(prefix='form1')
    togglesettings_form = ToggleSettingsForm(prefix='form2')
    radius_form = FieldRadiusForm(prefix='form3', instance=radius)
    change_color_form = ColorsForm(prefix='form4', instance=change_color)
    pagedetails_form = PageDetailsForm(
        prefix='form5', instance=page_details)
    fontsize_form = FontSizeForm(prefix='form6', instance=font_size)

    return render(request, 'dashboard.html', {'form': form, 'togglesettings_form': togglesettings_form, 'fontsize_form': fontsize_form, 'change_color_form': change_color_form, 'browser': browser, 'short_user': short_user, 'radius_form': radius_form, 'radius': radius, 'pagedetails_form': pagedetails_form})

return行中,您引用form

return render(request, 'dashboard.html', {'form': form, ...})

可以通过所有算法 go 无需命名创建form变量。 您可以将returntab推到右侧,使其处于else条件内。

else:
    form = FieldForm(prefix='form1')
    ...

    return render(request, 'dashboard.html', {'form': form, ...})

或者

只需删除else条件。

@login_required
def DashboardView(request):
    ...

    if request.method == 'POST':
        ...

    form = FieldForm(prefix='form1')
    ...

    return render(request, 'dashboard.html', {'form': form, ...})

您的最后一行似乎没有正确缩进:尝试在最后一行添加缩进级别,使其位于else块内

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM