我正在尝试使用 这个方法 将通知系统添加到我的 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)