使用.get(slug=slug)获取模型对象返回错误:邀请匹配查询不存在

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

我正在使用 django 创建通知系统,当创建邀请模型时,我使用 django 信号创建通知模型,但是当我创建邀请模型时,单击通知模板中的链接,它显示:

Invitation matching query does not exist 
。这是一个预订应用程序,我们希望通过电子邮件将该链接发送给创建邀请模型的人,以便他可以看到他的信息,但是当我在通知模板中单击该链接时,该链接不会提供该人的信息说:
DoesNotExist at /invitation_information/OlaRooms-123297186425/  Invitation matching query does not exist

views.py

def invitation_information(request, slug):
    invitation = Invitation.objects.get(slug=slug)
    return render(request, 'invitations.html', {'invitation':invitation})

url.py

    path('invitation_information/<slug:slug>/', views.invitation_information, name='invitation_information'),

通知模板

<div class="container">
        <div class="row">
            {% for notification in notifications %}
            {% if not notification.is_read %}
            <div class="col-md-3">
                <div class="card">
                    <div class="card-body">
                        <a href="{{ notification.link }}">
                            {{ notification.message }}
                        </a>
                    </div>
                </div>
            </div>
            {% endif %}
            {% endfor %}
        </div>
    </div>

信号:

@receiver(post_save, sender=Invitation)
def notification_signals(sender, instance, created, **kwargs):
    message = f"{instance.first_name} {instance.last_name} booked our {instance.room_type.room_type} room for {instance.number_of_day} day"
    link = reverse('Invitation_Information', args=[str(instance.room_type.slug)])
    room_id_number = generate_random_number()
    notification = Notification.objects.create(
        user=instance.room_type.user, message=message, link=link,
        room_id_number=room_id_number
    )
    notification.save()

我的模特:

class Room(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    room_type = models.ForeignKey(RoomType, on_delete=models.CASCADE)
    description = models.TextField()
    image_1 = models.ImageField()
    image_2 = models.ImageField()
    image_3 = models.ImageField()
    image_4 = models.ImageField()

    slug = models.SlugField(unique=True, default=generate_random_number_for_slug)

    def __str__(self):
        return str(self.room_type)

class Invitation(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=150)
    room_type = models.ForeignKey(Room, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)

    slug = models.SlugField(unique=True, default=generate_random_number)

    def __str__(self):
        return str(self.first_name)

class Notification(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    is_read = models.BooleanField(default=False)
    message = models.TextField()
    link = models.URLField()
    room_id_number = models.CharField(max_length=225, unique=True)

我该如何解决这个问题?这样当我点击链接时,它会显示人员信息,我使用

slug
而不是 id,因为使用 id:一个人可以通过输入 id 的数字来查看一些人的信息,但使用 slug,一看不到其他人的信息。

python django django-views django-urls
1个回答
0
投票

问题出在这一行:

link = reverse('Invitation_Information', args=[str(instance.room_type.slug)])

您正在生成一个带有属于 RoomType 的 slug 的链接,而不是邀请。以下应该修复它:

link = reverse('Invitation_Information', args=[str(instance.slug)])
© www.soinside.com 2019 - 2024. All rights reserved.