Переопределение метода сохранения модели не позволяет присваивать значения - PullRequest
1 голос
/ 26 мая 2019

Я пытаюсь переопределить метод сохранения модели и назначить значение полю при сохранении поля:

My models.py:

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}")

1 Ответ

1 голос
/ 26 мая 2019

Ваш NewInviteCode не возвращает ничего, это только print с что-то. Если функция Python не возвращает что-то явно, она возвращает None. Вы должны вернуть значение, например:

def NewInviteCode():
    from secrets import token_urlsafe
    <b>return</b> token_urlsafe(16)

При этом вы можете установить вызываемое значение как default= параметр [Django-doc] для поля, например:

def <b>new_invite_code</b>():
    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, <b>default=new_invite_code</b>, blank=True)

Таким образом, здесь мы не вызываем функцию, которую передаем new_invite_code, а не результат new_invite_code, поэтому мы не пишем скобки (например, * 1026) *).

это делает ваши модели и функции safe(..) проще.

Примечание : согласно руководству по стилю PEP-8 вам, вероятно, следует переименовать NewInviteCode в new_invite_code, как я сделал во втором фрагмент кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...