Django ModelForm 更新函数返回错误
Django ModelForm update function returning error
目前我的 Django 应用程序有一个设置模型,它保存了一组设置供程序的其余部分读取。
我已尝试创建一种方法来根据以下代码在应用程序上更新这些设置。
但是,当单击更新按钮时,应用程序 returns 'error':'Bad info' 变量而不是更新数据库。有谁知道是什么原因造成的,因为我似乎无法在代码中找到任何错误?
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/bootstrap@5.0.0/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">
{% 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 %}
是的,因为您的表单没有提交到更新视图的 URL,因为您有一个需要更新的设置对象,并且您正在传递视图中的 settings_pk
所以你需要添加你需要更新的设置的id。
更改 HTML
中的这一行
<form method="POST">
至
<form method="POST" action="{ url 'view_name' settings.pk }">
目前我的 Django 应用程序有一个设置模型,它保存了一组设置供程序的其余部分读取。
我已尝试创建一种方法来根据以下代码在应用程序上更新这些设置。
但是,当单击更新按钮时,应用程序 returns 'error':'Bad info' 变量而不是更新数据库。有谁知道是什么原因造成的,因为我似乎无法在代码中找到任何错误?
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/bootstrap@5.0.0/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">
{% 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 %}
是的,因为您的表单没有提交到更新视图的 URL,因为您有一个需要更新的设置对象,并且您正在传递视图中的 settings_pk
所以你需要添加你需要更新的设置的id。
更改 HTML
中的这一行<form method="POST">
至
<form method="POST" action="{ url 'view_name' settings.pk }">