在Django Admin中保存对模型值的更改时出现键值错误
我有一个使用注册表单创建用户的模型。表单工作正常,用户已创建并具有正确的值。但是,当我使用Django管理界面更改值并保存它们或保存并创建另一个值时,我会收到一条错误消息,如下所示(注意:我刚刚向模型添加了2个新值-已预批准且处于活动状态。我已进行了迁移): 错误可追溯到此行:在Django Admin中保存对模型值的更改时出现键值错误,django,django-models,Django,Django Models,我有一个使用注册表单创建用户的模型。表单工作正常,用户已创建并具有正确的值。但是,当我使用Django管理界面更改值并保存它们或保存并创建另一个值时,我会收到一条错误消息,如下所示(注意:我刚刚向模型添加了2个新值-已预批准且处于活动状态。我已进行了迁移): 错误可追溯到此行: super(ProfileTeacher, self).save(*args, **kwargs) 模型为(其中包含保存功能): 我在这里做错了什么?问题是您在评级中设置了null=False。这意味着,当您通过adm
super(ProfileTeacher, self).save(*args, **kwargs)
模型为(其中包含保存功能):
我在这里做错了什么?问题是您在
评级中设置了null=False
。这意味着,当您通过admin表单传递空值时,Django会尝试将空字符串保存到IntegerField
,但由于无法将其转换为整数,因此该操作失败
在字段上设置default=0
对您没有帮助-这仅适用于创建新模型实例且未为字段提供值的情况(即使该值为空字符串)
您有两个选项:在字段上允许null
值,或者向save()
方法添加一些逻辑,该方法在保存前检查空值并对其进行操作,例如:
def save(self, *args, **kwargs):
if self.rating == '':
self.rating = 0
super(ProfileTeacher, self).save(*args, **kwargs)
您应该显示您试图发送的数据。基本上,您发送的是一个int为的字符串expected@EduardGamonal我如何发送该数据,它在模型中指定的Admin中。我不知道它作为字符串而不是int接收的是什么,而且似乎也没有办法找到答案(很可能我在这里是个白痴),这让我感到困惑。它还解释了为什么当所有的值都放在哪里时它会保存,为什么当我清空它们时它仍然保存,因为我没有清空评级值。我错误地认为,因为它有一个选择领域,它不可能是罪魁祸首。
class ProfileTeacher(models.Model):
created = models.DateTimeField(auto_now=False, auto_now_add=True, blank = False, null = False, verbose_name = 'Creation Date')
user = models.OneToOneField(app_settings.USER_MODEL,blank=True, null=False)
first_name = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'First Name')
last_name = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Surname')
phone_number = models.CharField(max_length = 15, null=True, blank = True, verbose_name = 'Phone Number')
city = models.ForeignKey(City, null=True, blank = True, verbose_name = 'City')
postal_code = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Postal Code')
adress = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'Address')
nationality = CountryField(blank_label='(select country)', null=True, blank = True)
id_number = models.CharField(max_length = 400, null=True, blank = True, verbose_name = 'ID Number(NIF/NIE)')
bank_account = IBANField(verbose_name='IBAN', blank = True, null=True)
date_of_birth = models.DateField(auto_now=False, auto_now_add=False, blank = True, null = True, verbose_name='Date of birth')
#To enable them showing up in search. Only active teachers are shown and preapproved needs to be true to be active
preapproved = models.BooleanField(default=False, verbose_name='Pre-Approved')
active = models.BooleanField(default=False, verbose_name='Active')
#Braintree and Milingual Terms of Service Acceptance
tos = models.BooleanField(default=False, blank=True)
#If true will receive classes email notifications
email_notification = models.BooleanField(default=False, blank=True, verbose_name="Recibir Notificaciones")
GENDER = (
('male','Male'),
('female','Female'),
)
gender = models.CharField(max_length=20, choices=GENDER, blank = True, null=True, verbose_name = 'Gender' )
language = models.ForeignKey(Language, null = True, blank=True)
teacher_type = models.ForeignKey(TeacherType, null = True, blank=True, verbose_name='Type')
cvv = models.FileField(upload_to=teacher_directory_path, null=True, blank = True, verbose_name="CV")
profile_image = models.ImageField(upload_to=teacher_directory_path,
null = True,
blank=True,
default='/perfil.png',
)
RATINGS = (
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, '5'),
)
rating = models.IntegerField(default=0, choices=RATINGS, blank=True, verbose_name="RATINGS", null=False)
#True if the profile will appear on milingual site as Public
published = models.BooleanField(null=False, blank=False, default=True)
#Url: Teacher's Url
url = models.SlugField(max_length=400, null=True, blank = True, verbose_name='Url')
# True if teacher is legacy
legacy = models.BooleanField(default=False, blank=True)
legacy_id = models.IntegerField(default=0, null=True, blank=True)
class Meta:
verbose_name_plural = 'Teachers'
verbose_name = 'Teacher'
@property
def absolute_rating(self):
return int(float(self.rating)/5 * 100)
def save(self, *args, **kwargs):
# Check how the current values differ from ._loaded_values. For example,
# prevent changing the creator_id of the model. (This example doesn't
# support cases where 'creator_id' is deferred).
#Building_unique_url
url = str(self.first_name).lower() + '_' + str(self.last_name).lower() + '_' + str(int(self.user.id))
self.url = url
super(ProfileTeacher, self).save(*args, **kwargs)
def __unicode__(self):
return "%s %s" % (self.first_name, self.last_name)
def save(self, *args, **kwargs):
if self.rating == '':
self.rating = 0
super(ProfileTeacher, self).save(*args, **kwargs)