Django.db.utils.IntegrityError: NOT NULL constraint failed: main_companyclass.FinancialYearEnd
Я сталкиваюсь с вышеупомянутой ошибкой при попытке запустить мое приложение после создания формы, которая обновляет только 1 поле.
Что я пытаюсь достичь следующим образом:
Пользователь вводит клиента в приложение и сохраняет его в базе данных, после этого клиент должен отображаться на странице контрольного списка, где он будет отображать некоторые подробности о клиенте и показывать флажок (isdone_IT14), чтобы сказать, был ли заказ клиента выполнен.
Проблема в том, что когда пользователь устанавливает флажок и сохраняет его, не похоже, что он обновляет эту запись в модели.
Я создал следующую форму, чтобы помочь в этом:
class CompanyIT14Form(ModelForm):
class Meta:
model = CompanyClass
fields= ['isdone_IT14']
Но это явно не правильное решение. Кто-нибудь знает лучший способ решения этой ошибки?
Пожалуйста, посмотрите приведенный ниже код:
Models.py:
class CompanyClass(models.Model):
#Company Only Fields
CompanyName = models.CharField(max_length=50 , blank=False)
RefNo = models.CharField(max_length=50 , blank=False )
FinancialYearEnd = models.DateField(auto_now=False, auto_now_add=False, null=False)
#Contact Details
ContactPerson = models.CharField( max_length=50, blank=False)
EmailAddress = models.CharField(max_length=50, blank=False)
#Services
IT14 = models.BooleanField(default=True)
# CheckList
isdone_IT14 = models.BooleanField(default=False)
def __str__(self):
return ( self.CompanyName)
Forms.py:
class CompanyForm(ModelForm):
class Meta:
model = CompanyClass
fields = '__all__'
widgets = {
'FinancialYearEnd' : forms.SelectDateWidget,
}
class CompanyIT14Form(ModelForm):
class Meta:
model = CompanyClass
fields= ['isdone_IT14']
Views.py:
class companyIT14(View):
def get(self,request):
it14s = CompanyClass.objects.filter(IT14 = True).order_by('CompanyName')
form = CompanyIT14Form()
content = {'it14s':it14s , 'form':form}
return render(request, 'main/Checklists/companyIT14.html', content)
def post(self,request):
it14s = CompanyClass.objects.filter(IT14=True).order_by('CompanyName')
form = CompanyIT14Form(request.POST)
content = {'it14s': it14s, 'form': form}
if form.is_valid():
form.save()
return redirect('companyIT14')
else:
print(form.errors)
return render(request, 'main/checklistHome.html', content)
Template.html:
{% extends "main/base.html"%}
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
{% block content %}
<body>
<br>
{% if user.is_authenticated %}
<h1 class="h1" style="text-align: center">Companies IT14's</h1>
<table class="table table-hover table-dark" style="width: 80%;text-align: center;">
<thead>
<tr>
<th scope="col">Company</th>
<th scope="col">Ref No.</th>
<th scope="col">Contact Person</th>
<th scope="col">E-mail Address</th>
<th scope="col">Completed?</th>
<th scope="col">Save</th>
</tr>
</thead>
<tbody>
{% for x in it14s %}
<tr>
<th scope="row">{{ x.CompanyName }}</th>
<th>{{ x.RefNo }}</th>
<th>{{ x.ContactPerson }}</th>
<th>{{ x.EmailAddress }}</th>
<form class="form-group mt-4" method="post">
{% csrf_token %}
<th>{{ form.isdone_IT14 }}</th>
<th><button class="btn btn-success" type="submit">Save</button> </th>
</form>
{% endfor %}
</table>
{% endif %}
</body>
{% endblock %}
</html>
Вы, очевидно, пытаетесь save сохранить форму с None в качестве значения FinancialYearEnd, которая получила null=False, поэтому это запрещено. Если форма пытается сохранить объект со значением только isdone_IT14, она может дать None всем остальным и должна выдать эту ошибку.
Думаю, вы можете попробовать пока перейти на null=True и посмотреть, что на самом деле меняет форма в объектах.