KyleStranger
KyleStranger

Reputation: 241

Error: 404 Page Not Found. After trying to update a form

I currently have a settings model for my Django app which saves a set of settings for the rest of the program to read from.

I have tried to create a way to update these settings on the app, as per the below code.

When the update button is clicked, however, the app returns a page not found error instead of updating the database. Does anyone know what could be causing it because I cannot seem to find any errors in the code?

Views.py:

def viewSettings(request,  settings_pk):
    setting = get_object_or_404(SettingsClass, pk=settings_pk)
    if request.method == 'GET':
        form = SettingUpdateForm(instance=setting)
        return render(request, 'main/viewSettings.html', {'setting': setting, 'form':form})
    else:
        try:
            form =  SettingUpdateForm(request.POST, instance=setting)
            form.save()
            return redirect('settingsHome')
        except ValueError:
            return render(request, 'main/viewSettings.html', {'setting': setting, 'form':form, 'error':'Bad info'})

Models.py:

class SettingsClass(models.Model):

    Complex = models.CharField(choices=complex_list , max_length =  22 ,default='1' , unique=True)

    #Trial Balance Year To Date
    Trial_balance_Year_to_date= models.BooleanField(default = False)
    tbytd_Include_opening_balances=models.BooleanField(default = False)
    tbytd_Only_use_main_accounts=models.BooleanField(default = False)
    tbytd_Print_null_values=models.BooleanField(default = False)
    tbytd_Print_description=models.BooleanField(default = True)
    tbytd_Print_account=models.BooleanField(default = True)
    tbytd_Sort_by_account_name=models.BooleanField(default = True)

    #Trial Balance Monthly
    Trial_balance_Monthly=models.BooleanField(default = False)
    tbm_Only_use_main_accounts=models.BooleanField(default = False)
    tbm_Print_null_values=models.BooleanField(default = False)
    tbm_Print_description=models.BooleanField(default = True)
    tbm_Print_account=models.BooleanField(default = True)
    tbm_Sort_by_account_name=models.BooleanField(default = True)

    #Income Statement Year To Date
    Income_Statement_Year_to_date=models.BooleanField(default = False)
    isytd_Only_use_main_accounts=models.BooleanField(default = False)
    isytd_Sort_by_account_name=models.BooleanField(default = True)
    isytd_Print_null_values=models.BooleanField(default = False)
    isytd_Print_description=models.BooleanField(default = True)
    isytd_Print_account=models.BooleanField(default = True)

    #Income Statement Monthly
    Income_Statement_Monthly=models.BooleanField(default = False)
    ism_Only_use_main_accounts=models.BooleanField(default = False)
    ism_Sort_by_account_name=models.BooleanField(default = True)
    ism_Print_null_values=models.BooleanField(default = False)
    ism_Print_description=models.BooleanField(default = True)
    ism_Print_account=models.BooleanField(default = True)

    #Age Analysis
    Age_Analysis=models.BooleanField(default = False)
    aa_Include_all_customers=models.BooleanField(default = True)
    aa_Include_cash_customers=models.BooleanField(default = True)
    aa_include_on_hold_customers=models.BooleanField(default = True)
    aa_include_null_values=models.BooleanField(default = False)
    aa_allocate_unalocated_credits_to_oldest=models.BooleanField(default = True)

    #Balance Sheet
    Balance_Sheet=models.BooleanField(default = False)
    bs_Only_use_main_accounts=models.BooleanField(default = False)
    bs_Print_current_month=models.BooleanField(default = True)
    bs_Include_null_values=models.BooleanField(default = False)
    bs_Print_assets_first=models.BooleanField(default = True)
    bs_statement_of_financial_position=models.BooleanField(default = False)

    #Repair and Maintenance General Ledger
    Repair_and_Maintenance_General_Ledger=models.BooleanField(default = False)
    rmgl_Ignore_inactive_accounts=models.BooleanField(default = True)
    rmgl_Sort_by_transaction_date=models.BooleanField(default = True)
    rmgl_Group_by_account_type=models.BooleanField(default = True)
    rmgl_Print_description=models.BooleanField(default = True)
    rmgl_Print_account=models.BooleanField(default = True)
    rmgl_Print_year_to_date=models.BooleanField(default = True)
    rmgl_Print_monthly=models.BooleanField(default = False)

    #Major Capital Items General Ledger
    Major_capital_Items_General_Ledger=models.BooleanField(default = False)
    mcigl_Ignore_inactive_accounts=models.BooleanField(default = True)
    mcigl_Sort_by_transaction_date=models.BooleanField(default = True)
    mcigl_Group_by_account_type=models.BooleanField(default = True)
    mcigl_Print_description=models.BooleanField(default = True)
    mcigl_Print_account=models.BooleanField(default = True)
    mcigl_Print_year_to_date=models.BooleanField(default = True)
    mcigl_Print_monthly=models.BooleanField(default = False)

    def __str__(self):
        return (self.Complex + ' Settings')

Forms.py:

class SettingsForm(ModelForm):
     class Meta:
         model = SettingsClass
         fields = ('Complex','Trial_balance_Year_to_date' , 'Trial_balance_Monthly' , 'Income_Statement_Year_to_date' , 'Income_Statement_Monthly' , 'Age_Analysis' , 'Balance_Sheet' , 'Repair_and_Maintenance_General_Ledger' , 'Major_capital_Items_General_Ledger')

class SettingUpdateForm(ModelForm):
    class Meta:
        model = SettingsClass
        fields = '__all__'

ViewSettings.html:

 {% extends "main/base.html"%}
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous">
    
    {% block content %}
    
    {{ error }}
    
    <h2 style="text-align: center">{{ setting.Complex }}</h2>
     <hr>
    <br>
<form method="POST" action="{ url 'settingsHome' settings.pk }">
    {% csrf_token %}
    <div class="container">
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Trial_balance_Year_to_date }} Trial Balance Year To Date</li>
        <li class='list-group-item'>{{ form.tbytd_Include_opening_balances }} Include Opening Balances</li>
        <li class='list-group-item'>{{ form.tbytd_Only_use_main_accounts }} Only Use Main Accounts</li>
        <li class='list-group-item'>{{ form.tbytd_Print_null_values }} Print 0.00 Values</li>
        <li class='list-group-item'>{{ form.tbytd_Print_description }} Print Description</li>
        <li class='list-group-item'>{{ form.tbytd_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.tbytd_Sort_by_account_name }} Sort By Account Name</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Trial_balance_Monthly }} Trial Balance Monthly</li>
        <li class='list-group-item'>{{ form.tbm_Only_use_main_accounts }} Only Use Main Accounts</li>
        <li class='list-group-item'>{{ form.tbm_Print_null_values }} Print 0.00 Values</li>
        <li class='list-group-item'>{{ form.tbm_Print_description }} Print Description</li>
        <li class='list-group-item'>{{ form.tbm_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.tbm_Sort_by_account_name }} Sort By Account Name</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Income_Statement_Monthly }} Income Statement Monthly</li>
        <li class='list-group-item'>{{ form.ism_Only_use_main_accounts }} Only Use Main Accounts</li>
        <li class='list-group-item'>{{ form.ism_Print_null_values }} Print 0.00 Values</li>
        <li class='list-group-item'>{{ form.ism_Print_description }} Print Description</li>
        <li class='list-group-item'>{{ form.ism_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.ism_Sort_by_account_name }} Sort By Account Name</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Income_Statement_Year_to_date }} Income Statement Year To Date</li>
        <li class='list-group-item'>{{ form.isytd_Only_use_main_accounts }} Only Use Main Accounts</li>
        <li class='list-group-item'>{{ form.isytd_Print_null_values }} Print 0.00 Values</li>
        <li class='list-group-item'>{{ form.isytd_Print_description }} Print Description</li>
        <li class='list-group-item'>{{ form.isytd_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.isytd_Sort_by_account_name }} Sort By Account Name</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Age_Analysis }} Age Analysis</li>
        <li class='list-group-item'>{{ form.aa_Include_all_customers }} Include All Customers</li>
        <li class='list-group-item'>{{ form.aa_include_null_values }} Print 0.00 Values</li>
        <li class='list-group-item'>{{ form.aa_include_on_hold_customers }} Include On Hold Customers</li>
        <li class='list-group-item'>{{ form.aa_Include_cash_customers }} Include Cash Customers</li>
        <li class='list-group-item'>{{ form.aa_allocate_unalocated_credits_to_oldest }} Allocate Unalocated Credits To Oldest Records</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Balance_Sheet }} Balance Sheet</li>
        <li class='list-group-item'>{{ form.bs_Only_use_main_accounts }} Only Use Main Accounts</li>
        <li class='list-group-item'>{{ form.bs_Print_current_month }} Print The Current Month (Otherwise prints year to date)</li>
        <li class='list-group-item'>{{ form.bs_Include_null_values }} Include 0.00 values</li>
        <li class='list-group-item'>{{ form.bs_Print_assets_first }} Print Assets First</li>
        <li class='list-group-item'>{{ form.bs_statement_of_financial_position }} Statement Of Financial Position</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Repair_and_Maintenance_General_Ledger }} Repair And Maintenance General Ledger</li>
        <li class='list-group-item'>{{ form.rmgl_Ignore_inactive_accounts }} Ignore Inactive Accounts</li>
        <li class='list-group-item'>{{ form.rmgl_Sort_by_transaction_date }} Sort By Transaction Date</li>
        <li class='list-group-item'>{{ form.rmgl_Group_by_account_type }} Group By Account Type</li>
        <li class='list-group-item'>{{ form.rmgl_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.rmgl_Print_year_to_date }} Print Year To Date (Otherwise prints for the current month)</li>
      </ul>
      <br>
      <ul class='list-group'>
        <li class='list-group-item active'>{{ form.Major_capital_Items_General_Ledger }} Repair And Maintenance General Ledger</li>
        <li class='list-group-item'>{{ form.mcigl_Ignore_inactive_accounts }} Ignore Inactive Accounts</li>
        <li class='list-group-item'>{{ form.mcigl_Sort_by_transaction_date }} Sort By Transaction Date</li>
        <li class='list-group-item'>{{ form.mcigl_Group_by_account_type }} Group By Account Type</li>
        <li class='list-group-item'>{{ form.mcigl_Print_account }} Print Account</li>
        <li class='list-group-item'>{{ form.mcigl_Print_year_to_date }} Print Year To Date (Otherwise prints for the current month)</li>
      </ul>
    </div>
    <br>
    <br>
    <hr>
    <div class="btn-update" style="padding-left: 1%">
    <button type="submit" class='btn btn-primary'>Update</button>
    <button type="delete" class="btn btn-danger">Delete</button>
    </div>
    </form>
    
    {% endblock %}

URLS.PY:

from django.contrib import admin
from django.conf.urls import url
from django.urls import path , include
from accounts import views as v
from main import views as views

urlpatterns = [
    path('admin/', admin.site.urls),

    # Accounts
    path('login/home/' , views.home , name = 'home'),
    path('', v.register , name='register'),
    path('' , include('django.contrib.auth.urls') , name = 'login'),

    #Trial Balance
    path('KyletrbSettings' , views.KyletrbSettings , name = 'KyletrbSettings'),
    path('Kyletrb', views.Kyletrb , name = 'Kyletrb'),
    path('KyletrbMonth', views.KyletrbMonth , name = 'KyletrbMonth'),
    path('pdf' , views.printToPdf, name='printToPdf'),
    path('XLS' , views.printToXLS , name='printToXLS'),
    path('trb_Monthly' , views.trb_Monthly , name='trb_Monthly')

    #Settings
    path('settings', views.settingsHome , name='settingsHome'),
    path('ns' , views.newSetting , name='newSetting'),
    path('accConnect/setting/<int:settings_pk>', views.viewSettings, name='viewSettings' ),

]

Upvotes: 0

Views: 275

Answers (1)

Exprator
Exprator

Reputation: 27503

change this line

<form method="POST" action="{ url 'settingsHome' settings.pk }">

to

<form method="POST" action="{ url 'viewSettings' settings.pk }">

as you are redirecting the form submit to a wrong view and not the view where you are updating the settings object.

Upvotes: 1

Related Questions