Django 信号返回Notification.user 必须是“CustomUser”实例

问题描述 投票:0回答:0

我正在尝试使用 这个方法 将通知系统添加到我的 Django 应用程序中。我想在创建

Invitation
模型时通知我们的用户。然而问题是,
Invitation
模型没有
user
字段,我们不想将
user
字段添加到模型中,因为我们不想让要去的人要创建
Invitation
模型 a
user
,我如何通知用户他的
Invitation
模型之一已创建,我在下面使用的方法返回错误:
Cannot assign "<Invitation: Adamu>": "Notification.user" must be a "CustomUser" instance.

信号:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from .models import Level, Notification, Invitation
from django.urls import reverse

User = settings.AUTH_USER_MODEL

@receiver(post_save, sender=Invitation)
def comment_post_save(sender, instance, **kwargs):
    message = f'{instance.first_name} has booked our"{instance.select_type.level} room"'
    link = reverse('Open-Room', args=[str(instance.select_type.slug)])
    notification = Notification(user=instance, message=message, link=link)
    notification.save()

型号:

class Invitation(models.Model):
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    id_card = models.CharField(max_length=50, choices=ID_CARD)
    id_number = models.CharField(max_length=100)
    nationality = models.CharField(max_length=50, choices=LIST_OF_COUNTRY)
    state = models.CharField(max_length=50)
    town = models.CharField(max_length=50)
    address = models.CharField(max_length=90)
    phone_number = models.IntegerField()
    guardian_phone_number = models.IntegerField()
    number_of_day = models.IntegerField()
    visited_for = models.CharField(max_length=40, choices=VISITED_FOR_THIS)
    date_created = models.DateTimeField(auto_now_add=True)
    select_type = models.ForeignKey(LevelType, on_delete=models.CASCADE)
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            # generate a random 15-character string
            random_string = ''.join(random.choices(string.ascii_lowercase + string.digits, k=15))
            self.slug = f"{slugify(self.nationality)}-{random_string}"
        super().save(*args, **kwargs)
    
    def __str__(self):
        return str(self.first_name)

class Notification(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    message = models.TextField()
    link = models.URLField(blank=True, null=True)
    read = models.BooleanField(default=False)

class LevelType(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)
python django django-models django-signals
© www.soinside.com 2019 - 2024. All rights reserved.