首页 > 解决方案 > 在基于类的视图中获取帖子 ID

问题描述

试图在views.py 的Detailview 中获取帖子ID。我正在尝试在博客详细信息页面上添加点赞按钮。我想我需要在 get_absolute_url 函数的 kwargs 中添加 id ,但这不起作用或者我没有正确添加。所以,请帮助我。

#views.py
class PostDetail(DetailView):
  model = Post
  template_name = 'post_detail.html'

def get_context_data(self, *args, **kwargs):
    context = super(PostDetail, self).get_context_data(*args, **kwargs)
    post = get_object_or_404(Post, id=self.kwargs['id'])
    is_liked = False
    if post.likes.filter(id=request.user.id).exists():
        is_liked = True
    context["post"] = post
    context["is_liked"] = is_liked
    return context

模型.py

class Post(models.Model):
  cover = models.URLField(blank=True)
  tag = models.CharField(max_length=100, unique=True, default=0)
  title = models.CharField(max_length=200, unique=True)
  slug = models.SlugField(max_length=200, unique=True)
  author = models.ForeignKey(accountUser, on_delete=models.CASCADE)
  updated_on = models.DateTimeField(auto_now=True)
  content = models.TextField()
  likes = models.ManyToManyField(accountUser, related_name='likes', blank=True)
  created_on = models.DateTimeField(auto_now_add=True)
  status = models.IntegerField(choices=STATUS, default=0)

class Meta:
    ordering = ["-created_on"]

def __str__(self):
    return self.title

def total_likes(self):
    return self.likes.count()


def get_absolute_url(self):

    return reverse("post_detail", kwargs={"slug": str(self.slug)})

终端错误

#error
post = get_object_or_404(Post, id=self.kwargs['id'])
KeyError: 'id'

标签: djangodjango-modelsdjango-views

解决方案


self.kwargs 在 get_context_data kwargs 中有所不同,而 kwargs 取决于您的 url

代替:

post = get_object_or_404(Post, id=self.kwargs['id'])

经过 :

post = self.get_object()

你在 DetailView 中,所以你有方法 get_object,用于获取你的 post 对象并验证对象是否存在


推荐阅读