覆盖 RedirectView 通用视图的 get_redirect_url 函数的问题

Issues overriding the get_redirect_url function for the RedirectView generic view

所以我正在尝试为我的 Django 博客实现一个类似 Toggle 的 post - 我希望覆盖 get_redirect_url 这样用户就可以喜欢 posts在我的博客上。我概述了 class 如下:

class PostLikeToggle(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        slug = self.kwargs.get("slug")
        obj = get_object_or_404(Post, slug=slug)
        url_ = obj.get_absolute_url()
        self.request.user

        if user.is_authenticated():
            obj.likes.add(user)
        return url_

但是,我认为问题在于我如何获得我的 post 对象 - 我目前正在 post slug 上执行此操作.我想定义 SEO 友好的 post 列表,因此我定义了 url 模式如下:

url_patterns = [
         url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/'\
             r'(?P<post>[-\w]+)/$', views.post_detail, name = 'post_detail'),
         url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/'\
             r'(?P<post>[-\w]+)/like/$', views.PostLikeToggle.as_view(), name = 'post_like'),
]

我已尝试修改以上内容以通过在 url 中将 <post> 替换为 <slug> 来引用 "slug"。没用。然后我尝试在 get_redirect_url 函数中定义 post:

        post = self.kwargs.get("post")
        obj = get_object_or_404(Post, post=post)

同样,没有用。我只是在尝试各种方法来尝试让它发挥作用——但遗憾的是,还没有运气——所以我想把它扔给 Django 争论社区中更有经验的人。

谢谢。

如果您的 url 模式包含 (?P<post>[-\w]+),那么您应该使用 self.kwargs.get("post") 而不是 self.kwargs.get("slug")

get_object_or_404 中,您必须使用 slug= 而不是 post=,因为您是在 Post.slug 字段上进行过滤。

def get_redirect_url(self, *args, **kwargs):
    slug = self.kwargs.get("post")
    obj = get_object_or_404(Post, slug=slug)
    ...

如果 slug 对于每个日期都是唯一的而不是唯一的,那么您可能还必须从 self.kwargs 中获取 yearmonthday