0

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})
``
vize
  • 93
  • 1
  • 10

3 Answers3

1

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})
user8193706
  • 2,387
  • 2
  • 8
  • 12
  • Thanks, problem solved. Now when i submit a form i get the ValueError _The view dashboard.views.DashboardView didn't return an HttpResponse object. It returned None instead._ Is there a new error or is the error caused by the indentation of the last line? – vize Feb 01 '22 at 13:21
  • Alrights its a new issue _ If you make a POST request, and the form is not valid, you do not return any result._ – vize Feb 01 '22 at 13:25
  • Try my second solution with deleting `else`. – NixonSparrow Feb 01 '22 at 13:25
  • Have you got this error after `render` inside else statement – user8193706 Feb 01 '22 at 13:26
  • currently i have not deleted the else statement yet, I just added a second render if the form is invalid. No I'm trying to find out, why I can't submit forms – vize Feb 01 '22 at 13:28
  • You got it @vize return `HttpResponse` if `form` is not valid. – user8193706 Feb 01 '22 at 13:29
  • That was a bad idea. Now all forms are deleted inside the template ^^ – vize Feb 01 '22 at 13:31
  • It has something to do with the way i wrote the views file with this questions https://stackoverflow.com/questions/1395807/proper-way-to-handle-multiple-forms-on-one-page-in-django – vize Feb 01 '22 at 13:33
1

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, ...})
NixonSparrow
  • 6,130
  • 1
  • 6
  • 18
1

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