Receita de campo slug!

74 views
Skip to first unread message

Italo Maia

unread,
Nov 9, 2009, 2:50:55 AM11/9/09
to web2py-users-brazil
Alguém teria uma receitinha de campo slug no web2py? Tipo, método para
converter string+formato no db.py+configuração do admin ou algo assim.
Gostaria, por exemplo, de popular o campo slug, no admin, antes de
salvar, e que ele não aparecesse para edição.

Por enquanto, o meu está assim:

Field('slug', 'string', unique=True),

yamandu

unread,
Nov 9, 2009, 8:50:27 AM11/9/09
to web2py-users-brazil
Acho que não entendi!

Italo Maia

unread,
Nov 9, 2009, 2:45:04 PM11/9/09
to web2py-users-brazil
Seguinte, um slug é um textozinho que não possui espaços, caracteres
acentuados, e etc. Ele normalmente é usado para criar urls
"amigáveis". Tipo, urls tipo : blog/2009/08/10/conto-da-carochinha-e-
otimo é uma url formada de duas partes, uma data, e um slug.

data - 2009/08/10/
slug - conto-da-carochinha-e-otimo

Note que os espaços foram substituídos por '-' e os caracteres
acentuados por caracteres não acentuados. O meu problema é que eu
gostaria de saber como eu posso criar um método de update e default
para um campo no model que preencha meu slug, automaticamente, para
mim. Algo como:

db.define_table('pages', Field('name', 'string'), Field('slug',
'string', unique=True))

Aí eu gostaria que, antes de salvar, o valor do slug fosse atualizado
a partir do campo name. Algo como:

db.insert('pages', name='conto da carochinha é ótimo')

E isso criasse um "pages" para mim com os valores:
page: {name:'conto da carochinha é ótimo', 'slug':'conto-da-carochinha-
e-otimo'}

Eu gostaria que esse comportamento também funcionasse no admin.

moriarty

unread,
Nov 10, 2009, 11:15:37 AM11/10/09
to web2py-users-brazil
Podes usar javascript pra isso[1]

Ou usar o form factory escondendo o campo do slug:
db.pages.default = ' ' #uma string qualquer caso o campo não possa ser
null
db.pages.readable = False
db.pages.writable = False
form = SQLFORM.factory(db.pages)

e na validação fazer a slug, teria que criar um método slugify ou algo
parecido para fazer essa transformação:
if form.accepts(request.vars):
db.pages.insert(name=request.vars['name'], slug=slugify
(request.vars['name']) )


Mas acredito que seria uma boa idéia tem algo no web2py que já
convertesse esse valor "auto-magicamente"


[1]http://leocaseiro.com.br/jquery-plugin-string-to-slug/

moriarty

unread,
Nov 11, 2009, 11:03:36 AM11/11/09
to web2py-users-brazil
Só corrigindo o meu erro de digitação:

Mas acredito que seria uma boa idéia TER algo no web2py que já
convertesse esse valor "auto-magicamente"

Álvaro Justen [Turicas]

unread,
Nov 11, 2009, 7:34:52 PM11/11/09
to web2py-us...@googlegroups.com
2009/11/11 moriarty <moriarty...@gmail.com>:
>
> Só corrigindo o meu erro de digitação:
>
> Mas acredito que seria uma boa idéia TER algo no web2py que já
> convertesse esse valor "auto-magicamente"

Eu já sugeri isso uma vez...seria legal ter um campo chamado 'slug'
que se referenciasse a outro campo (e tivesse o JavaScript
automaticamente criado etc.).
Ítalo, acho que a resposta do moriarty responde sua pergunta.
Quando conseguir resolver o problema, poste o código e nos informe,
assim fica mais fácil enviar patches com essa nova funcionalidade.
--
Álvaro Justen
Diretor de Desenvolvimento
Peta5 - Nós fazemos TV digital
http://www.peta5.com.br/
21. 3021-6001 / 9898-0141

Fernando Macedo

unread,
Jan 12, 2012, 11:11:33 AM1/12/12
to web2py-us...@googlegroups.com
Olá pessoal,

Algum up nesta thread?

Estou precisando implementar um slug. Existe alguma receita pronta?

Estou pensando em utilizar computed fields [1], e a princípio, utilizando a função slugify, que só encontrei como template filter do Django [2].


Obrigado,
Fernando Macedo

Tito Garrido

unread,
Jan 12, 2012, 11:48:45 AM1/12/12
to web2py-us...@googlegroups.com
Oi Fernando, procurando na lista principal do web2py achei uma tred e nela tinha um cada explicando como ele implementou:
There's a validator if you want to save a slug to the DB:

Here's how I do it. I have a computed field for my records:

def slug(self):
    return '%s-%s' % (urlify(self.item.title, max_length=50), self.item.id)

And a function to return the id from a slug:

def id_from_slug(slug):
    id = slug.split('-')[-1]
    if id.isdigit():
        return id
    else:
        return None

So I can do things like:
<a href="{{=URL('default', 'item', extension='', args=item.slug)}}">
and
item = db(db.item.id==id_from_slug(
request.args(0))).select().first()


Espero que ajude...

2012/1/12 Fernando Macedo <fgma...@gmail.com>
Fernando Macedo

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en



--

Linux User #387870
.........____
.... _/_õ|__|
..º[ .-.___.-._| . . . .
.__( o)__( o).:_______

Bruno Rocha

unread,
Jan 13, 2012, 12:57:36 AM1/13/12
to web2py-us...@googlegroups.com
exemplo:

db.define_table("posts", Field("title", unique=True, notnull=True), Field("slug", unique=True, notnull=True))

Se você quer que o slug seja gerado automaticamente atraves do titulo do post (perigo de duplicidade!)

db.posts.title.requires = IS_NOT_IN_DB(db, 'posts.title')
db.posts.slug.compute = lambda row, value: IS_SLUG(row.title)[0]

Se você quer que o usuário possa colocar algum texto no campo slug e então gravar como slug faça.

db.posts.slug.requires = [IS_SLUG(), IS_NOT_IN_DB(db, 'posts.slug')]

--

Fernando Macedo

unread,
Jan 14, 2012, 7:30:37 AM1/14/12
to web2py-us...@googlegroups.com
Bacana! Obrigado pela ajuda!

Um abraço!

Bruno Rocha

unread,
Jan 16, 2012, 8:07:04 PM1/16/12
to web2py-us...@googlegroups.com
Correção


ISSO:


db.posts.slug.compute = lambda row, value: IS_SLUG(row.title)[0]

tem que ser isso:

db.posts.slug.compute = lambda row, value: IS_SLUG()(row.title)[0]

Reply all
Reply to author
Forward
0 new messages