Django在每个用户的UI中隐藏帖子(对象)而不影响主模型

Posted

技术标签:

【中文标题】Django在每个用户的UI中隐藏帖子(对象)而不影响主模型【英文标题】:Django Hide Posts(objects) in UI per User without affecting main model 【发布时间】:2020-02-20 08:45:48 【问题描述】:

我有一个应用程序可以显示所有具有以下模型的新闻站点:

class NewsItem(models.Model):
    url = models.CharField(max_length=500, default="",unique=True)
    title = models.CharField(max_length=500, default="")
    hacker_news_url = models.CharField(max_length=500, default="")
    posted_on = models.DateTimeField(default=datetime.now)
    upvote_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)

用户界面:

我已经设置了默认的 django 身份验证来查看这个页面。 用户界面对每个帖子都有隐藏按钮。所以问题是如果登录的用户隐藏了帖子,它必须只为该用户隐藏(即使在页面刷新之后),而不从 NewsItem 模型/表中删除。怎么做?请帮忙!

这是我的views.py:

@login_required(login_url='/accounts/login')
def index(request):
    context='news_items':NewsItem.objects.all().order_by('posted_on')
    return render(request, "hello.html", context)

【问题讨论】:

【参考方案1】:

您需要在某处设置某种“阅读证明”。 一种方法是在 NewsItemUser 模型之间添加一个 M2M。

只要用户点击“标记为已读”,您就会执行NewsItem.users.add(request.user) 之类的操作,并且您可以在index 视图中过滤您的NewsItem

class NewsItem(models.Model):
    url = models.CharField(max_length=500, default="",unique=True)
    title = models.CharField(max_length=500, default="")
    hacker_news_url = models.CharField(max_length=500, default="")
    posted_on = models.DateTimeField(default=datetime.now)
    upvote_count = models.IntegerField(default=0)
    comment_count = models.IntegerField(default=0)

    users = models.ManyToManyField('your-user-model', verbose_name="Readers", related_name="reads")

在“makemigrations/migrate”之后,您认为:

@login_required(login_url='/accounts/login')$
def index(request):
    news = NewsItem.objects.exclude(users=request.user).order_by('posted_on')
    context='news_items':news
    return render(request, "hello.html", context)

@login_required(login_url='/accounts/login')
@require_http_methods(['POST'])
def read(request, news_item_pk):
    """
    This is the most basic example.
    If you use AJAX Calls, Do not forget to add your CSFR;
    """
    news = get_object_or_404(NewsItem, pk=news_item_pk)
    news.users.add(request.user)
    return HttpResponse()

最后在您的视图中,您应该添加您的read 视图

【讨论】:

哇!!你真棒。这对我很有帮助。非常感谢。

以上是关于Django在每个用户的UI中隐藏帖子(对象)而不影响主模型的主要内容,如果未能解决你的问题,请参考以下文章

从其他页面隐藏网页的 UI 元素 [wordpress]

从所有记录中获取所有相关的多对多,而不是从每个记录 laravel

django模型对象重用而不擦除数据

评论显示在django的每个帖子上?

在 Django 中进行一个复杂的查询,我所有的后续帖子

Django更新每个用户的月度得分,并对其所有帖子进行总点赞