Категории и теги в Django

Сегодня задался целью выводить теги в шаблоне, не знаю правда пока зачем мне это, мне и категорий хватало, но все же раз я в своей модели использую теги, то решил их вывести под названием статьи. Решено сделано.

 

 

Раз уж писать статью по этому поводу, то и заодно и про категории напишу.

 

 

Для решения этой задачи у меня в модели имеется класс:

 

 

class ManyToManyField(othermodel[, **options])

 

 

Многое ко многим, так как статьи могут иметь много тегов и теги могут иметь много статей 

 

 

Для категорий исользуется класс:

 

 

classForeignKey(othermodel[, **options])

 

 

Здесь по-другому, категории имеют много статей, а статья имеет одну категорию.

 

 

У меня он реализован следующим образом:

 

 

Class Post (Models.model):

 

 

...   

 

 

tag=models.ManyToManyField(Tag)  

 

 

category=models.ForeignKey(Category)

 

 

И создаем модели категории и тегов: 

 

 

Category(models.Model):

 

 

    name = models.CharField(max_length=100)

 

 

    def __unicode__(self):

 

 

        return self.name

 

 

class Tag(models.Model):

 

 

    name = models.CharField(max_length=50)     def __unicode__(self):

 

 

        return self.name

 

 

После этого можно запускать syncdb.

 

 

Регистрируем все это в admin.py:

 

 

from django.contrib import admin

 

 

from blog.models import Post, Tag, Category

 

 

admin.site.register(Tag)

 

 

admin.site.register(Category) 

 

 

...

 

 

Ну а теперь выводим все это в шаблоне. Здесь я не буду рассказывать о мелочах и том как создать свой блог, если вы этого не знаете, то читайте предыдущии статьи в категории. Это статья в основном для тех у кого уже есть представления о том как создавать блог на django.

 

 

Вывод в шаблон выглядит следующим образом:

 

 

{% for post in posts %}

<li>

<h3> <a href='{{post.get_absolute_url}}'>{{ post.title }}</a></h3>

 <a href="/category/{{post.category.id}}"> {{post.category}}</a>

 

 

С категориями все просто, их не надо перебирать и перечислять. С тегами дело обстоит иначе, если мы сделаем по аналогии с категориями , то название тега в шаблоне будет выглядить примерно так :

 

 

<django.db.models.fields.related.ManyRelatedManager object at 0x10454545>.

 

 

во всем виновато many_to_many field, его надо сначало обойти счетчиком, а уж потом выводить. Сделать это можно так:

 

 

<p>Теги:{% for tag in post.tag.all %}<a href="/tag/{{tag.id}}"> {{tag}}</a>{% if not forloop.last %}, {% endif %}{%endfor%}</p>

 

 

Вы заметили, что перебор мы делаем из post.tag.all, это обязательно, иначе ничего не получится.

 

 

 {% if not forloop.last %}, {% endif %} - выводит запятую если тегов у статьи много.

 

 

Как это все работает смотрите на моем блоге. Это теги и категории, которые выводятся под названием статьи.

Позвонить

Городской: +7(8793)33-16-17
Мобильный: +7(928)911-74-69

Написать

manager@kmv-it.ru

Приехать

г.Пятигорск переулок Первомайский 18

Логотип Кухня сайтов