2017-10-09 54 views
0

我正在研究一个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) 

帮助,我请!

提前致谢!

回答

0

最好的方法是在视图中通过筛选QuerySet将其进一步传递给模板。

+0

两者都是独立的对象如何我可以在视图中做到这一点吗?请! –

+0

@AbdulRehman显示你的代码有问题,我会提供帮助。它依赖于你使用基于类的视图或基于功能的视图。 – andi

0

您可以简单地通过这样的用户排除的选项:

queryset_list = Article.objects.filter(category=cat).exclude(user=request.user) 

希望它能帮助!

+0

文章和标记文章是两种不同的模型,当一篇文章被用户标记,然后保存在一个新的模型中作为TaggedArticle,现在我需要隐藏标记文章在我的模板中。如果我有这两个查询(Article& TaggedArticle模型)在视图中,并作为模板的上下文传递,但在模板中,如果它在TaggedArticle中,我该如何隐藏文章? –

+0

@AbdulRehman发布你的模特请 –

0

最后回答:忘了回复声明!

您有几种选择:

  • 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 %} 
    

希望它有帮助!

+0

嗨@efkin!感谢您的回答,但它不起作用,我在{%if not ...%}消息中显示了一条消息{%endif%}它显示了所有文章的消息。 –

+0

刚刚更新了答案,我忘记了'is_from_request_user()'方法中的return语句-_- – efkin

0

我已经通过在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 %}