Получение этой ошибки при попытке отправить modelForm. Проблема заключается в сохранении формы в sqlite3 из-за ограничений. Если кто-то может помочь мне разобраться, пожалуйста. Заранее спасибо Ниже приведен код для моего вида и модели.
IntegrityError at /admin/small_small_hr/staffprofile/add/
NOT NULL constraint failed: small_small_hr_staffprofile.data
Request Method: POST
Request URL: http://localhost:8000/admin/small_small_hr/staffprofile/add/
Django Version: 2.2
Exception Type: IntegrityError
Exception Value:
NOT NULL constraint failed: small_small_hr_staffprofile.data
Exception Location: C:\Users\hp\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 383
Python Executable: C:\Users\hp\Anaconda3\python.exe
Python Version: 3.7.4
Вид:
@user_passes_test(lambda u: u.is_superuser)
def CreateStaff(request):
if request.method == 'POST':
form = StaffProfileAdminCreateForm(request.POST)
if form.is_valid():
form.save()
messages.success(request, f'Staff created successfully')
return redirect('home')
else:
form = StaffProfileAdminCreateForm()
return render(request, 'small_small_hr/create-staff.html', {'form': form})
Модель:
class StaffProfile(TimeStampedModel, models.Model):
"""
StaffProfile model class
Extends auth.User and adds more fields
"""
NOT_KNOWN = '0'
MALE = '1'
FEMALE = '2'
NOT_APPLICABLE = '9'
SEX_CHOICES = (
(NOT_KNOWN, _('Not Known')),
(MALE, _('Male')),
(FEMALE, _('Female')),
(NOT_APPLICABLE, _('Not Applicable'))
)
user = models.OneToOneField(
USER, verbose_name=_('User'), on_delete=models.CASCADE)
image = ImageField(upload_to="profile_pics", max_length=255,
verbose_name=_("Profile Image"),
help_text=_("A square image works best"), blank=True)
sex = models.CharField(_('Gender'), choices=SEX_CHOICES, max_length=1,
default=NOT_KNOWN, blank=True, db_index=True)
role = models.ForeignKey(Role, verbose_name=_('Role'), blank=True,
default=None, null=True,
on_delete=models.SET_NULL)
phone = PhoneNumberField(_('Phone'), blank=True, default='')
address = models.TextField(_('Addresss'), blank=True, default="")
birthday = models.DateField(_('Birthday'), blank=True, default=None,
null=True)
leave_days = models.PositiveIntegerField(
_('Leave days'), default=21, blank=True,
help_text=_('Number of leave days allowed in a year.'))
sick_days = models.PositiveIntegerField(
_('Sick days'), default=10, blank=True,
help_text=_('Number of sick days allowed in a year.'))
overtime_allowed = models.BooleanField(
_('Overtime allowed'), blank=True, default=False)
start_date = models.DateField(
_('Start Date'), null=True, default=None, blank=True,
help_text=_('The start date of employment'))
end_date = models.DateField(
_('End Date'), null=True, default=None, blank=True,
help_text=_('The end date of employment'))
data = JSONField(_('Data'), default=dict, blank=True)
class Meta: # pylint: disable=too-few-public-methods
"""
Meta options for StaffProfile
"""
abstract = False
verbose_name = _('Staff Profile')
verbose_name_plural = _('Staff Profiles')
ordering = ['user__first_name', 'user__last_name', 'user__username',
'created']
def get_name(self):
"""
Returns the staff member's name
"""
# pylint: disable=no-member
return f'{self.user.first_name} {self.user.last_name}'
def get_approved_leave_days(self, year: int = datetime.today().year):
"""
Get approved leave days in the current year
"""
# pylint: disable=no-member
return get_taken_leave_days(
staffprofile=self,
status=Leave.APPROVED,
leave_type=Leave.REGULAR,
start_year=year,
end_year=year
)
def get_approved_sick_days(self, year: int = datetime.today().year):
"""
Get approved leave days in the current year
"""
return get_taken_leave_days(
staffprofile=self,
status=Leave.APPROVED,
leave_type=Leave.SICK,
start_year=year,
end_year=year
)
def get_available_leave_days(self, year: int = datetime.today().year):
"""
Get available leave days
"""
try:
# pylint: disable=no-member
leave_record = AnnualLeave.objects.get(
leave_type=Leave.REGULAR,
staff=self,
year=year)
except AnnualLeave.DoesNotExist:
return Decimal(0)
else:
return leave_record.get_available_leave_days()
def get_available_sick_days(self, year: int = datetime.today().year):
"""
Get available sick days
"""
try:
# pylint: disable=no-member
leave_record = AnnualLeave.objects.get(
leave_type=Leave.SICK,
staff=self,
year=year)
except AnnualLeave.DoesNotExist:
return Decimal(0)
else:
return leave_record.get_available_leave_days()
def __str__(self):
return self.get_name()