Django 在每个用户 UI 中隐藏帖子(对象)而不影响主模型
Django Hide Posts(objects) in UI per User without affecting main model
我有一个应用程序可以显示所有具有以下模型的新闻网站:
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)
UI:
我已经设置了默认的 django 身份验证来查看此页面。
ui 每个 post 都有隐藏按钮。所以问题是 如果登录用户隐藏了 post,它必须只为该用户隐藏(即使在页面刷新后)而不从 NewsItem Model/Table 中删除.怎么做?请帮忙!
这是我的 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)
您需要在某些地方设置某种 "Proof Of Reading"。
一种方法是在 NewsItem
和 User
模型之间添加一个 M2M。
只要用户点击 "Mark As Read",您就可以执行类似 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
观点
我有一个应用程序可以显示所有具有以下模型的新闻网站:
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)
UI:
我已经设置了默认的 django 身份验证来查看此页面。 ui 每个 post 都有隐藏按钮。所以问题是 如果登录用户隐藏了 post,它必须只为该用户隐藏(即使在页面刷新后)而不从 NewsItem Model/Table 中删除.怎么做?请帮忙!
这是我的 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)
您需要在某些地方设置某种 "Proof Of Reading"。
一种方法是在 NewsItem
和 User
模型之间添加一个 M2M。
只要用户点击 "Mark As Read",您就可以执行类似 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
观点