Olá pessoas, nesse mês de janeiro comecei a desenvolver um CMS utilizando o ótimo framework Django. Durante o processo abracei a causa DRY (don’t repeat yourself) e acabei encontrado ótimas aplicações disponibilizadas pela comunidade. Nos próximos posts vou mostrar algumas aplicações que diminuem ainda mais o tempo necessário para construir uma aplicação de grande porte.
O django-tagging é uma aplicação de tags genérica, com ela possível criar tags específicas para cada tipo de objeto. Sendo assim, pode-se adicionar tags a qualquer modelo do seu projeto.
Digamos que tenha o seguinte modelo:
from django.db import models
class BlogPost(models.Model):
title = models.CharField(max_length=30)
body = models.TextField()
date_posted = models.DateField()
É um simples modelo de post, mas para adicionar a funcionalidade de tags fazemos:
from django.db import models
from tagging.fields import TagField
class BlogPost(models.Model):
title = models.CharField(max_length=30)
body = models.TextField()
date_posted = models.DateField()
tags = TagField()
O django-tagging adiciona um novo campo chamado TagField onde as tags serão cadastradas. Para facilitar ainda mais pode adicionar os seguintes métodos:
def _get_tags(self):
return Tag.objects.get_for_object(self)
def _set_tags(self, tag_list):
Tag.objects.update_tags(self, tag_list)
tags = property(_get_tags, _set_tags)
Agora para obter as tags relacionadas ao BlogPost fazemos assim:
e = BlogPost.objects.get(pk=12)
e.tags # retorna a lista de tags
e.tags = 'foo bar' # agora o BlogPost possui as tags foo e bar
Então, imagine uma situação em que vários modelos da sua aplicação possuem um campo de tag, seria interessante descobrir quais são as tags usadas num determinado tipo de modelo, para isso podemos fazer:
from myapp.models import MyModel
from tagging.models import Tag
m1 = MyModel.objects.get(pk=1)
Tag.objects.update_tags(m1, 'house thing')
m2 = MyModel.objects.get(pk=2)
Tag.objects.update_tags(m2, 'cheese toast house')
Tag.objects.usage_for_model(MyModel)
[<Tag: cheese>, <Tag: house>, <Tag: thing>, <Tag: toast>]
O código retorna uma lista com todas as tags utilizadas pelo modelo MyModel. Ainda é possível saber quantas vezes cada tag foi usada pelo modelo.
tags = Tag.objects.usage_for_model(MyModel, counts=True)
[(tag.name, tag.count) for tag in tags]
[('cheese', 1), ('house', 2), ('thing', 1), ('toast', 1)]
Para ter o total de tags e limitar o mínimo para um determinado número usamos o argumento min_count.
tags = Tag.objects.usage_for_model(MyModel, min_count=2)
[(tag.name, tag.count) for tag in tags]
[('house', 2)]
Ainda é possível selecionar objetos baseados nas suas tags.
from tagging.models import TaggedItem
house_tag = Tag.objects.get(name='house')
TaggedItem.objects.get_by_model(MyModel, house_tag)
[<Widget: pk=1>, <Widget: pk=2>]
O django-tagging é muito poderoso para mais detalhes leia a documentação disponível no arquivo de download.
No próximo post estarei mostrando mais sobre o django-tinymce e do django-compress. Até a próxima!