简体   繁体   中英

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.

I gave my submit buttons a name, for example form1_btn for my first form.

Before I could even try if it works, I get the following error, even though I specified in the Else statement what happens when request != 'POST

local variable 'form' referenced before assignment

View Files

@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})
``

You define form inside else statement and you are rendering the form outside of try-except-else so the form instance is not found. I think you are rendering form inside else statement so just return inside else statement.

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})

In the return row you are referencing form :

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

It is possible to go through all algorith without naming creating form variable. you can push that return a tab to the right so it would be inside else condition.

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

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

OR

just delete else condition.

@login_required
def DashboardView(request):
    ...

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

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

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

Your last line doesn't seem to be indented correctly: try to add an indent level to your last line, so that it is inside the else block

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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