我正在尝试覆盖模型的保存方法,并在保存字段时为字段分配一个值:
我的型号:
def NewInviteCode():
import secrets
print(secrets.token_urlsafe(16))
class Invitation(models.Model):
id = models.AutoField(primary_key=True, unique=True)
name = models.CharField(max_length=300, default='', blank=True)
email = models.EmailField(max_length=100, default='')
mobile = models.CharField(max_length=15, default='', blank=True)
last_sent = models.DateTimeField(default=timezone.now)
num_invitations = models.IntegerField(default=1)
uniqcode = models.CharField(max_length=300, default='', blank=True)
def save(self, *args, **kwargs):
if not self.uniqcode:
self.uniqcode = NewInviteCode()
print(f"Saved new unique code: {self.uniqcode}")
if self.num_invitations:
self.num_invitations = self.num_invitations + 1
print(f"Sending invitation to {self.email}..")
SendInviteActual(self.email)
print(f"Parameters to be saved are: Code:{self.uniqcode} Name: {self.name} Email: {self.email}")
super().save(*args, **kwargs) # Call the "real" save() method.
不幸的是,在我的代码执行中:
fktewVPm63tV-YqXxWPNxQ
Saved new unique code: None
Sending invitation to joel@domain.com.
Mail sent
Parameters to be saved are: Code:None Name: joel Email: joel@domain.com
2019-05-26 20:04:48,972 django.request ERROR Internal Server Error: /clinic/sendinvites
以下代码行有什么问题?
if not self.uniqcode:
self.uniqcode = NewInviteCode()
print(f"Saved new unique code: {self.uniqcode}")
您的 NewInviteCode
不会返回任何东西,它只有 print
s 东西。如果Python函数没有明确返回某些内容,则返回None
。您应该返回一个值,例如:
def NewInviteCode():
from secrets import token_urlsafe
return token_urlsafe(16)
话虽如此,您可以将可呼叫设置为 default=
parameter [django-doc],例如:
def new_invite_code():
from secrets import token_urlsafe
return token_urlsafe(16)
class Invitation(models.Model):
id = models.AutoField(primary_key=True, unique=True)
name = models.CharField(max_length=300, default='', blank=True)
email = models.EmailField(max_length=100, default='')
mobile = models.CharField(max_length=15, default='', blank=True)
last_sent = models.DateTimeField(default=timezone.now)
num_invitations = models.IntegerField(default=1)
uniqcode = models.CharField(max_length=300, default=new_invite_code, blank=True)
我们在这里做不是调用我们通过 new_invite_code
的函数,而不是 new_invite_code
的结果,因此我们做 not 写括号(例如 (。new_invite_code()
这使您的模型和safe(..)
功能更简单。
NOTE :根据 PEP-8 样式指南,您可能应该像第二个代码片段一样将
。NewInviteCode
重命名为new_invite_code
。