比较Django模板中的用户相关对象
我正在研究一个Django项目,其中有一篇文章模型,表单,视图。 该文章的模型中有用户字段,related_name为“标记”。 现在,我想隐藏用户在Django模板中创建的文章, 我该怎么做到这一点?比较Django模板中的用户相关对象
喜欢的东西:
{% if tag in articles %}
更新 这是我的看法是@andi要求:
class Tagging(LoginRequiredMixin, generic.DetailView):
def get(self, request, *args, **kwargs):
cat = self.kwargs.get('cat')
print(cat)
queryset_list = Article.objects.all().filter(category=cat)
paginator = Paginator(queryset_list, 1)
page_request_var = "page"
page = request.GET.get(page_request_var)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
queryset = paginator.page(1)
except EmptyPage:
queryset = paginator.page(paginator.num_pages)
context = {
'articles': queryset,
'page_request_var': page_request_var,
}
return render(request, 'users/tagging.html', context)
我的模型
这些模型的两个来自不同应用
TaggedArticle型号:
choices = (
('yes', 'Yes'),
('no', 'No'),
('not sure', 'Not Sure'),
)
class TaggedArticle(models.Model):
user = models.ForeignKey(User, related_name='tagging')
category_fit = models.CharField(choices=choices, max_length=255)
article = models.ForeignKey(Article, related_name='articles')
relevant_feedback = models.TextField(blank=True)
created_at = models.DateTimeField(default=timezone.now, editable=False)
文章型号:
class Article(models.Model):
link = models.URLField(max_length=255)
category = models.CharField(max_length=255, choices=Categories)
帮助,我请!
提前致谢!
最好的方法是在视图中通过筛选QuerySet将其进一步传递给模板。
您可以简单地通过这样的用户排除的选项:
queryset_list = Article.objects.filter(category=cat).exclude(user=request.user)
希望它能帮助!
文章和标记文章是两种不同的模型,当一篇文章被用户标记,然后保存在一个新的模型中作为TaggedArticle,现在我需要隐藏标记文章在我的模板中。如果我有这两个查询(Article& TaggedArticle模型)在视图中,并作为模板的上下文传递,但在模板中,如果它在TaggedArticle中,我该如何隐藏文章? –
@AbdulRehman发布你的模特请 –
最后回答:忘了回复声明!
您有几种选择:
-
Article.objects.filter(articles__is_null=True)
在替代@JahongirRamanov的解决方案,如果你如果你想在模板中,只有整个查询集不需要整个查询集模板 -
“隐藏” 在它:你需要一个不同的环境,也许服用点,如:
# models.py class Article(models.Model): ... def is_from_request_user(self, request): return TaggedArticle.objects.filter(article=self, user=request.user).exists() # views .py def get(self, request, *args, **kwargs): ... context = { "articles" = [{"object": article, "from_user": article.is_from_request_user(request)} for article in queryset], ..., } # in template {% for article in articles %} {% if not article.from_user %} ... {% endif %} {% endfor %}
希望它有帮助!
嗨@efkin!感谢您的回答,但它不起作用,我在{%if not ...%}消息中显示了一条消息{%endif%}它显示了所有文章的消息。 –
刚刚更新了答案,我忘记了'is_from_request_user()'方法中的return语句-_- – efkin
我已经通过在TaggedArticle模型中添加链接字段来管理它,然后比较模板中两个模型的链接字段并获得所需结果。
这里是我的更新TaggedArticle型号:
choices = (
('yes', 'Yes'),
('no', 'No'),
('not sure', 'Not Sure'),
)
class TaggedArticle(models.Model):
user = models.ForeignKey(User, related_name='tagging')
category_fit = models.CharField(choices=choices, max_length=255)
article = models.ForeignKey(Article, related_name='articles')
link = models.URLField(max_length=255,)
relevant_feedback = models.TextField(blank=True)
created_at = models.DateTimeField(default=timezone.now, editable=False)
这里是我的最新观点:
class Tagging(LoginRequiredMixin, generic.DetailView):
def get(self, request, *args, **kwargs):
cat = self.kwargs.get('cat')
print(cat)
queryset_list = Article.objects.all().filter(category=cat)
tagged = TaggedArticle.objects.all().filter(user=request.user)
paginator = Paginator(queryset_list, 1)
page_request_var = "page"
page = request.GET.get(page_request_var)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
queryset = paginator.page(1)
except EmptyPage:
queryset = paginator.page(paginator.num_pages)
context = {
'articles': queryset,
'page_request_var': page_request_var,
'tagged': tagged,
}
return render(request, 'users/tagging.html', context)
这里就是我在模板做了:
{% for art in articles %}
{% for tag in tagged %}
{% if tag.link in art.link %}
<h2>Already Tagged</h2>
{% endif%}
{% endfor %}
{% endfor %}
两者都是独立的对象如何我可以在视图中做到这一点吗?请! –
@AbdulRehman显示你的代码有问题,我会提供帮助。它依赖于你使用基于类的视图或基于功能的视图。 – andi