2016-07-07 3 views
0

Что я хотел бы сделать это с помощью фильтра() в шаблоне Джанго, как Belows:Можно ли использовать фильтр() в шаблоне django?

models.py

from django.db import models 
From Django. utils import Timezone 

class Category(models.Model): 
    url = models.CharField(max_length=200) 
    site_name = models.CharField(max_length=50) 
    board_name = models.CharField(max_length=50) 

class Post(models.Model): 
    title = models.CharField(max_length=200) 
    content = models.TextField(blank=True) 
    category = models.ForeignKey(Category) 
    created_date = models.DateField(blank=True, null=True) 
    crawl_date = models.DateTimeField() 
    num_of_comments = models.PositiveSmallIntegerField(default=0, blank=True, null=True) 
    notice = models.BooleanField(default=False) 

views.py

def post_list(request, site_name=None, page=1): 
    categories = Category.objects.filter(site_name=site_name.upper()).order_by('board_name') 
    return render(request, 'SNU/post_list.html', {'site_name':site_name.upper(), 'categories':categories}) 

post_list.html

{% for category in categories %} 
    <p> {{category}} </p> 
    {% for post in category.post_set.filter(notice=True) %} 
     <li>{{ post.title }}</li> 
    {% endfor %} 
{% endfor %} 

В post_list .html, {% for post in category.post_set.filter(notice=True) %} возникает ошибка. Только category.post_set.all - это тот, который я могу использовать в шаблоне?

+0

Возможный дубликат [Как вызвать функцию, которая принимает аргумент в шаблоне Django?] (Http://stackoverflow.com/questions/2468804/how-to-call-function-that-takes-an-argument-in-a-django-template) – rafalmp

ответ

0

Вы можете сделать это на уровне представления по

def post_list(request, site_name=None, page=1): 
    categories = Category.objects.filter(site_name=site_name.upper(), 
             notice=True).order_by('board_name') 
    return render(request, 'SNU/post_list.html',{'site_name':site_name.upper(), 
       'categories':categories}) 

Если по какой-то причине вам нужны все категории, а не только те, которые имеют уведомление = True, добавить еще один запрос без уведомления = True в фильтре и передать его в словаре.

В качестве альтернативы, вы можете создать пользовательский тег и обеспечить фильтр - см https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/

+0

'notice' находится в модели Post, а не в модели категорий. – user3595632

+0

Вы не можете использовать фильтр в самом шаблоне, поэтому вам нужно создать тег шаблона, как в ссылке выше, или передать сообщения как отдельный параметр. в основном вы можете создать тег {% get_posts category_id%} и итерации – dmitryro

+0

Подробнее об этом http://stackoverflow.com/questions/6451304/django-simple-custom-template-tag-example – dmitryro

Смежные вопросы