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

时间:2017-06-09 10:51:12

标签: django django-views url-routing django-urls

所以我正在尝试为我的Django博客实现像Toggle这样的帖子 - 我希望覆盖get_redirect_url,以便用户可以在我的博客上发布帖子。我按如下方式概述了课程:

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 slug。我想定义SEO友好的帖子列表,因此我定义了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'),
]

我已经尝试通过在网址中将<post>替换为<slug>来修改上述内容以引用“slug”。没工作。然后我尝试在get_redirect_url函数中定义post:

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

再一次,没有用。我只是尝试各种各样的事情来尝试让它发挥作用 - 但遗憾的是,没有运气 - 所以我会把它扔给Django争吵社区中你经验丰富的人。

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您的网址格式包含(?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仅对每个日期而言是唯一的,那么您可能还必须从year获取monthdayself.kwargs