我关注了 Coreys 博客应用,并集成了评论功能。我现在在尝试删除附有评论的评论时出现问题。
在 stackoverflow 上阅读了大约一百万个帖子后,大多数人会提到 USER on_delete,但我的似乎已经在 CASCADE 上了。
奇怪的问题。 用户可以删除没有评论的帖子
问题是评论不能删除的帖子(外键约束问题)
错误:
邮政
请求网址:http://127.0.0.1:8000/post/31/delete/
Django 版本:3.1.4
异常类型:IntegrityError
异常值:
外键约束失败
我应该能够创建一个帖子,让多个用户评论该帖子。然后,如果帖子的用户希望删除帖子,则应删除所有评论(显然 - 已添加级联)
models.py(后置函数)
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.CharField(choices=cat_new_choice, max_length=200,default='Onboarding')
likes = models.ManyToManyField(User, related_name='blog_posts', blank=True)
#user who created this post, then the user gets deleted - what happens to the post? this will delete his post as well
def __str__(self):
return self.title
def total_likes(self):
return self.likes.all().count()
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
models.py 评论功能
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments", on_delete=models.CASCADE)
body = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, on_delete=models.CASCADE )
def user_comment_post(sender, instance, *args, **kwargs):
comment = instance
post = comment.post
text_preview = comment.body[:90]
sender = comment.user
notify = Notification(post=post, sender=sender, user=post.author, text_preview=text_preview, notification_type=2)
notify.save()
def user_delete_comment(sender, instance, *args, **kwargs):
comment = instance
post = comment.post
sender = comment.user
notify = Notification.objects.filter(post=post, user=post.author, sender=sender, notification_type=2)
notify.delete()
views.py(删除视图)
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
success_url = '/'
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
post-detail.html(删除功能) {% if object.author == 用户 %}
<div class="float-right">
<br />
<a class="btn btn-secondary btn-sm " href="{% url 'post-update' object.id %}">Update</a>
<a class="btn btn-danger btn-sm " href="{% url 'post-delete' object.id %}">Delete</a>
</div>
{% endif %}
更新:所有notification.py
class Notification(models.Model):
NOTIFICATION_TYPES = (
(1, 'Like'),
(2, 'Comment')
)
post = models.ForeignKey('blog.Post', on_delete=models.CASCADE, related_name="notif_post", blank=True, null= True)
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notif_from_user")
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="notif_to_user")
notification_type = models.IntegerField(choices= NOTIFICATION_TYPES)
text_preview = models.CharField(max_length=90, blank=True)
date = models.DateTimeField(auto_now_add=True)
is_seen = models.BooleanField(default=False)