Pesquisar este blog

quinta-feira, 18 de outubro de 2007

Filtro para classes

Pois é, ontem, estava eu, querendo colocar uns visuais legais no meu mais novo projeto em django, quando me deparei com um problema. Eu tinha que insersir algumas classes em um field de um formulário(tenta fala isso três vezes bem rápido :D). Aí, minhas opções? Eu poderia fazer como sugeriu-me certa vez, cumpadre Andrew, ou, poderia criar um filtro para fazer o serviço.

A primeira solução consiste em, após criar o form com a shortcut model_for_form, editar os atributos do widget. Solução bem direta, entretanto, ela ocorre na view do Django.

A segunda solução consiste em criar um filtro, dar um load nele, no template, e utilizá-lo normalmente. Essa segunda solução me atraiu bastante pois ela evita definir a parte visual dos dados no código python. Não que isso seja a pior coisa do mundo, mas se eu estiver trabalhando com um designer, por exemplo, facilita a edição da pobre criatura das trevas.

Sem mais delongas( tun tun tun tun tun ), aqui vai o meu pedacinho de código, que, diga-se de passagem, talvez precise melhorar quanto a sintaxe. Na verdade, eu queria que ele fosse capaz de modificar coisas como o id e outros atributos do widget gerado, mas não consegui pensar em uma sintaxe "bonita o suficiente" para tamanha proeza.
Código:

# -*- coding: utf-8 -*-

from django import template

register = template.Library()

@register.filter
def mclass(value, arg):
"""Adiciona classes da marcação (x)html a um field de um form.
Caso o valor passado seja uma string, arg deve estar no formato
'tag, class1 class2 class3...classN' onde tag é a o elemento (x)html
com o qual o texto deve ser mostrado. Caso contrário, o argumento
deve estar na forma 'class1 class2 class3...classN'"""
try:
if type(value) == type(u"") or type(value) == type(""):
tag,classes = arg.split(',')
value = "<"+tag+" class='"+classes.strip()+"'>"+value+""
else:
value.field.widget.attrs.update({'class':arg})
except: pass
return value

Sugestões são bem vindas, ok?

Nenhum comentário:

Postar um comentário