python - “NOT NULL 约束失败:small_small_hr_staffprofile.data”
问题描述
尝试提交 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()
解决方案
你有这个,它允许 "" 但不允许NULL
:
data = JSONField(_('Data'), default=dict, blank=True)
您要么需要允许NULL
:
data = JSONField(_('Data'), default=dict, blank=True, null=True)
或者确保数据永远不会null
出现在您的代码中。
推荐阅读
- javascript - 如何使用Angular Js检查具有存储在数据库中的现有逗号分隔值的复选框值
- javascript - 模式和页面上显示的内容
- javascript - 修改此代码以删除“年份”部分
- selenium - Selenium ChromeDriver 在使用凭据加载站点时显示空白页面
- ajax - reactjs中的AJAX请求中的问题
- python - ResourceExhaustedError(请参阅上面的回溯):分配具有形状的张量时出现 OOM [28800,19200]
- ios - keywindow 中的插件无法响应用户事件?
- templates - 使用数组元素作为非类型模板参数?
- perl - 如何让 perl 获取 https 网站链接以触发 cron 作业
- javascript - 使用 Javascript 删除 DOM 元素