【问题标题】:How can I add a favorite article marking system with django generic class-based view?如何使用 django 基于类的通用视图添加最喜欢的文章标记系统?
【发布时间】:2019-11-10 23:53:21
【问题描述】:

我正在尝试让我的用户标记他们可以稍后阅读的最喜欢的帖子。 我见过一些使用 FBV 的解决方案,但我想用 CBV 制作最喜欢的标记。

如何使用 django 基于类的视图 (DetailView) 来做到这一点?

型号

class Article(models.Model):
    ...
    favorite = models.ManyToManyField(get_user_model(),  related_name='favorite', blank=True)

    def get_absolute_url(self):
        return reverse('article_detail', args=[str(self.id)])

观看次数

class ArticleDetailView(ObjectViewMixin, DetailView):
    model = Article
    context_object_name = 'article'
    ...
    def get_context_data(self, **kwargs):
        ...
        return context


def favorite_post(request, id):
    post = get_object_or_404(Article, id=id)
    if post.favorite.filter(id=request.user.id).exists():
        post.favorite.remove(request.user)
    else:
        post.favorite.add(request.user)
    return redirect('article_detail', pk=article.pk)

网址

urlpatterns = [
    path('<int:pk>/edit/', ArticleUpdateView.as_view(), name='article_update'),
    path('<int:pk>/favorite_post/', favorite_post, name='favorite_post'),
]

【问题讨论】:

    标签: python django django-class-based-views django-2.2


    【解决方案1】:

    您可以尝试使用UpdateView 并覆盖其post() 方法;您可以使用其.get_object() 方法获取当前的Article 实例。

    views.py

    from django.views.generic import UpdateView
    from .models import Article
    
    class MyUpdateView(UpdateView):
        http_method_names = ['post', ]
        model = Article
    
        def post(self, *args, **kwargs):
            self.object = self.get_object()
    
            if self.object.favorite.filter(id=request.user.id).exists():
                self.object.favorite.remove(request.user)
            else:
                self.object.favorite.add(request.user)
    
            return redirect('article_detail', pk=self.object.pk)
    

    urls.py

    urlpatterns = [
        ...
        path('<int:pk>/favorite_post/', MyUpdateView.as_view(), name='favorite_post'),
    ]
    

    这对你有用吗?

    【讨论】:

    • 嗨@Ralf,当request.user不是article.author时会抛出403错误。我希望任何用户都可以使用此功能。不仅是文章作者。
    • @TareqMonwer 我不知道为什么我的代码会引发 403。除了我的答案中的代码之外,您是否添加了任何代码?
    • 是的,我做到了。我认为这是针对移民问题的。我现在面临迁移问题。它说我要申请迁移,但迁移不起作用。我也试过 --fake 。没用。请问有什么解决办法吗?
    • @TareqMonwer 你能详细说明“它没有那么好”的意思吗?
    • 帖子请求不会重定向到文章详情页面,而是停留在 favorite_post url。
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多