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

Adi*_*aju 3 django django-models django-admin django-views django-authentication

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

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)
Run Code Online (Sandbox Code Playgroud)

用户界面: 在此输入图像描述

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

这是我的观点.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)
Run Code Online (Sandbox Code Playgroud)

小智 5

您需要在某个地方设置某种“阅读证明”。NewsItem实现此目的的一种方法是在模型之间添加 M2M User

一旦用户单击“标记为已读”,您就可以执行类似的操作NewsItem.users.add(request.user),并且可以NewsItemindex视图中过滤您的内容。

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")
Run Code Online (Sandbox Code Playgroud)

在“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()
Run Code Online (Sandbox Code Playgroud)

最后在你的观点中,你应该添加你的read观点