Editar campos de la base de datos

114 views
Skip to first unread message

DMA

unread,
Feb 12, 2012, 12:18:45 PM2/12/12
to web2py-usuarios
Estoy desesperado. Lo he intentado por formularios HTML, por SQLFORM,
por Crud, ¡por todo! He conseguido aprende a crear y borrar con el
Crud, pero, ¿cómo puedo lograr editar ciertos datos de una tabla? Por
ejemplo...

En la tabla db.batidos hay una fila de ID 6 que tiene un campo
db.batidos.nombre llamado fresa, y otro db.batidos.imagen donde hay
una foto. Claro, evidentemente está ahí porque ya se ha creado, ¿pero
cómo se puede lograr que un usuario pueda editar exactamente esos dos
campos de esa ID 6 de db.batidos? Es decir, ¿qué debe llevar la línea
de código del crud o del SQLFORM para poder editar ese en concreto? ¿?
Ayuda ;___;.

nicolás rosbaco

unread,
Feb 12, 2012, 12:37:08 PM2/12/12
to web2py-...@googlegroups.com
SQLFORM(table, record=None, deletable=False,
        linkto=None, upload=None, fields=None, labels=None, col3={},
        submit_button='Submit', delete_label='Check to delete:',
        id_label='Record id: ', showid=True,
        readonly=False, comments=True, keepopts=[],
       ignore_rw=False, formstyle='table3cols',**attributes)


en una de esas form = SQLFROM(nombreTabla, fields=[nombre,imagen])

http://www.latinuxpress.com/books/drafts/web2py/caps/cap7.html#sqlform
--
"En un país colonial las oligarquías son las dueñas de los diccionarios" (John William Cooke)

nicolás rosbaco

unread,
Feb 12, 2012, 12:44:43 PM2/12/12
to web2py-...@googlegroups.com
perdón leí mal.

esto que te pasé no te sirve.....

Se me ocurre una posibilidad poco bonita. Creas un formulario con dos campos del tipo que queres que edite, consultas la tabla y recuperas la info a editar, le asignas esa info a los campos del formulario que le permitís editar al usuario y se lo mandás....


registro = db(db.mitabla.id==6).select().first()
form = SQLFORM.factory(.... los dos campos que te interesan)
#antes de enviarlo lo submitias
form.vars.nombre = registro.nombre
form.vars.imagen = registro.imagen
return dict(form=form)

la verdad no se muy bien... esto pa intentar enmendar la macana que te pase en el mail anterior. Pero me se ocurre que puede servir para salir del paso

suerte

DMA

unread,
Feb 12, 2012, 3:22:12 PM2/12/12
to web2py-usuarios
Me da error:
<type 'exceptions.AttributeError'> 'NoneType' object has no attribute
'titulo'

El error me dice que está en esta línea:
form.vars.nombre = registro.nombre

¿Alguna idea de qué tengo que corregir? ¿?

On Feb 12, 6:44 pm, nicolás rosbaco <antiya...@gmail.com> wrote:
> perdón leí mal.
>
> esto que te pasé no te sirve.....
>
> Se me ocurre una posibilidad poco bonita. Creas un formulario con dos
> campos del tipo que queres que edite, consultas la tabla y recuperas la
> info a editar, le asignas esa info a los campos del formulario que le
> permitís editar al usuario y se lo mandás....
>
> registro = db(db.mitabla.id==6).select().first()
> form = SQLFORM.factory(.... los dos campos que te interesan)
> #antes de enviarlo lo submitias
> form.vars.nombre = registro.nombre
> form.vars.imagen = registro.imagen
> return dict(form=form)
>
> la verdad no se muy bien... esto pa intentar enmendar la macana que te pase
> en el mail anterior. Pero me se ocurre que puede servir para salir del paso
>
> suerte
>
> El 12 de febrero de 2012 14:37, nicolás rosbaco <antiya...@gmail.com>escribió:
>
>
>
>
>
>
>
>
>
> > SQLFORM(table, record=None, deletable=False,
> >         linkto=None, upload=None, fields=None, labels=None, col3={},
> >         submit_button='Submit', delete_label='Check to delete:',
> >         id_label='Record id: ', showid=True,
> >         readonly=False, comments=True, keepopts=[],
> >        ignore_rw=False, formstyle='table3cols',**attributes)
>
> > en una de esas form = SQLFROM(nombreTabla, fields=[nombre,imagen])
>
> >http://www.latinuxpress.com/books/drafts/web2py/caps/cap7.html#sqlform
>

Martín Mulone

unread,
Feb 12, 2012, 7:15:13 PM2/12/12
to web2py-...@googlegroups.com
capaz si nos mostrás un poco de código te podemos ayudar un poco más.

esto despliega el formulario para editar el registro id=6 con el campo imagen solamente:

record_id = 6
form = SQLFORM(db.batidos, record_id, fields=[db.batidos.imagen])

nicolás rosbaco

unread,
Feb 12, 2012, 11:53:46 PM2/12/12
to web2py-...@googlegroups.com

Que raro parece que registro sea de algún tipo raro. Usaste first?

Proba castear a string registro

De todos modos me gusta más la solución que te proponen en el otro mail

_______________
desde celu y posiblemente apurado. sepa disculpar errores de edición.

El feb 12, 2012 8:22 p.m., "DMA" <dma161...@gmail.com> escribió:

Me da error:
<type 'exceptions.AttributeError'> 'NoneType' object has no attribute
'titulo'

El error me dice que está en esta línea:
form.vars.nombre = registro.nombre

¿Alguna idea de qué tengo que corregir? ¿?


On Feb 12, 6:44 pm, nicolás rosbaco <antiya...@gmail.com> wrote:
> perdón leí mal.
>

> esto que te ...

> El 12 de febrero de 2012 14:37, nicolás rosbaco <antiya...@gmail.com>escribió:

>
>
>
>
>
>
>
>
>
> > SQLFORM(table, record=None, deletable=False,
> >         linkto=None, upload=N...

> > El 12 de febrero de 2012 14:18, DMA <dma161803...@gmail.com> escribió:

>
> > Estoy desesperado. Lo he intentado por formularios HTML, por SQLFORM,

> >> por Crud, ¡por todo...

nicolás rosbaco

unread,
Feb 13, 2012, 12:34:28 AM2/13/12
to web2py-...@googlegroups.com
hola, porbé lo que te pase:

    form = SQLFORM(db.avisos)
    form.vars.titulo = 'uno'

y en la vista hago esto:

{{=type(form.vars.titulo)}}
{{=form.vars.titulo}}

el resultado que obtengo es el siguiente (cuando se renderiza la vista):

<type 'str'> uno

(no hay salto de lineas ni nada como verás)

en fin, el campo es tipo str.... PERO

si evito la asignación:     form.vars.titulo = 'uno'

la salida en la vista es así:

<type 'NoneType'>

con lo cual... no se cual será tu inconveniente ahí...

pregunto: registro es el resultado de la consulta en la tabla??? verificaste que la consulta no sea vacía??

no se me ocurre nada más....

insśito me gusta más esta otra posibilidad que te propone Martín:


        form = SQLFORM(db.avisos, record=4, fields=['titulo','texto'])


fijate que va con unas diferencias de sintaxis

suerte

Alan Etkin

unread,
Feb 13, 2012, 5:42:06 AM2/13/12
to web2py-usuarios
> cómo se puede lograr que un usuario pueda editar exactamente esos dos
> campos de esa ID 6 de db.batidos

El ejemplo de Martín (cambiando fields=[db.batidos.imagen] por
fields=[db.batidos.imagen, db.batidos.nombre] tendría que hacer
exactamente lo que planteaste). Además podés usar
headers={"batidos.imagen": "Imagen", "batidos.nombre": "Nombre"} al
crear el objeto SQLFORM para personalizar los encabezados de la tabla
o headers="fieldname"capitalize"

Este error:
<type 'exceptions.AttributeError'> 'NoneType' object has no attribute
'titulo'

Ocurre usualmente tu aplicación o web2py intentan acceder a un campo y
el id del registro no es válido, posiblemente al inicializar un objeto
formulario o tabla.

Alan Etkin

unread,
Feb 13, 2012, 5:54:10 AM2/13/12
to web2py-usuarios
Hay un par de errores en mi post anterior:

> exactamente lo que planteaste). Además podés usar
> headers={"batidos.imagen": "Imagen", "batidos.nombre": "Nombre"} al
> crear el objeto SQLFORM para personalizar los encabezados de la tabla

-El parámetro para personalizar los nombres de campos (no encabezados)
en SQLFORM es labels, no headers.
Headers se usa para personalizar encabezados de tablas en SQLTABLE.

> o headers="fieldname"capitalize"

-headers="fieldname:capitalize" se utiliza como argumento en SQLTABLE,
pero no figura como válido para SQLFORM.

DMA

unread,
Feb 22, 2012, 8:04:39 AM2/22/12
to web2py-usuarios
Disculpad por haber tardado tanto en responder. Decidí instalarme
Linux en mi ordenador y tuve problemas personales, siento la tardanza
de la respuesta xD".

Lo que me ha puesto Martín me funciona si elimino lo de
fields=[db.batidos.imagen]. He probado también con un crud.update y es
el mismo resultado. No obstante, aparece un problema nuevo...

Cuando cambio algo en los formularios y hago click en el submit, los
formularios se quedan en blanco y no se edita nada en las tablas.
Tampoco me funciona cuando especifico con un next que vaya a una URL
en concreto. ¿Qué hay mal hecho? Pongo el código:

EN EL DB.PY

db.define_table('metas_usuarios',
Field('titulo', 'string', length='20'),
Field('descripcion', 'text', length='300'),
Field('fecha', 'datetime', default=request.now, writable=False),
Field('id_usuario', db.auth_user, default=auth.user_id,
writable=False))
db.metas_usuarios.titulo.requires = IS_NOT_EMPTY()
db.metas_usuarios.descripcion.requires = IS_NOT_EMPTY()

EN EL CONTROLADOR

def editarmetasant():
record_id = request.post_vars.editar
form = SQLFORM(db.metas_usuarios, record_id)
return dict(form=form)

EN EL VIEW

{{=form.custom.begin}}
Título
{{=form.custom.widget.titulo}}<br>
Descripción
{{=form.custom.widget.descripcion}}<br>
{{=form.custom.submit}}
{{=form.custom.end}}

On 13 feb, 01:15, Martín Mulone <mulone.mar...@gmail.com> wrote:
> capaz si nos mostrás un poco de código te podemos ayudar un poco más.
>
> esto despliega el formulario para editar el registro id=6 con el campo
> imagen solamente:
>
> record_id = 6
> form = SQLFORM(db.batidos, record_id, fields=[db.batidos.imagen])
>

Alan Etkin

unread,
Feb 23, 2012, 8:31:02 AM2/23/12
to web2py-usuarios
Te falta el manejo de errores del formulario, según creo, que no es
automático con SQLFORM.
En el manual en línea está detallado cómo devolver errores al validar
el formulario:
http://www.latinuxpress.com/books/drafts/web2py/caps/cap7.html#sqlform-e-insert-update-delete

DMA

unread,
Feb 23, 2012, 12:15:32 PM2/23/12
to web2py-usuarios
No entiendo, ¿qué tengo que modificar y qué tengo que poner
exactamente? Lo he leído varias veces y sigo sin pillarlo. Yo no
quiero que salga un flash diciendo "error en el formulario" xD.

On 23 feb, 14:31, Alan Etkin <spame...@gmail.com> wrote:
> Te falta el manejo de errores del formulario, según creo, que no es
> automático con SQLFORM.
> En el manual en línea está detallado cómo devolver errores al validar
> el formulario:http://www.latinuxpress.com/books/drafts/web2py/caps/cap7.html#sqlfor...

Alan Etkin

unread,
Feb 24, 2012, 5:14:42 AM2/24/12
to web2py-usuarios
Hay un error en mi post anterior, SQLFORM sí muestra los errores en el
navegador si el formulario no pasa la validación (a menos que
explícitamente se utilice hideerror=True).

Me parece que el problema puede estar en que no procesás el formulario
al enviarlo al servidor. Podés utilizar este comando debajo de
SQLFORM(...) en el controlador:

if form.accepts(request.vars, session):
# rutina a realizar al aceptarse el formulario
# accepts() actualiza la base de datos si el formulario valida.
...

DMA

unread,
Feb 24, 2012, 11:35:15 AM2/24/12
to web2py-...@googlegroups.com
No me funciona xD". Ocurre lo mismo.

DMA

unread,
Feb 24, 2012, 12:40:51 PM2/24/12
to web2py-...@googlegroups.com
En serio, insisto. Lo que ocurre es que una vez pongo en los formularios lo que quiera, si le doy a enviar, se me vacían. En cambio, si pongo algo como:

def editarmetasant():
    record_id = request.post_vars.editar or redirect(URL('escritorio'))
    form = crud.update(db.metas_usuarios, record_id,
         next = URL('editarmetas'))
    return dict(form=form)

Me manda al escritorio ._.". Al parecer poder ver se ve, pero lo que es editar, enviar la solicitud o lo que sea, pues pasa...

Luis Díaz

unread,
Feb 24, 2012, 12:47:22 PM2/24/12
to web2py-...@googlegroups.com
trata de mandar el record_id como un argumento y no como un vars_post
de esta forma la pagina lo conserva luego de procesar el formulario y así no te salta al escritorio

Díaz Luis
Analista Programador Facultad de Odontología UC
http://www.about.me/diazluis
User Linux 532223

DMA

unread,
Feb 24, 2012, 1:59:14 PM2/24/12
to web2py-...@googlegroups.com
Pasa lo mismo ^^"

Alan Etkin

unread,
Feb 25, 2012, 9:20:17 AM2/25/12
to web2py-usuarios
> si le doy a enviar, se me vacían

Esto ocurre si el formulario valida (tendrías que comprobar con la
interfaz administrativa que se actualizó la base de datos)

> record_id = request.post_vars.editar or redirect(URL('escritorio'))

Si esto genera una redirección a otra página chequeá el valor de
record_id, posiblemente el formulario de origen está vacío en el campo
"editar" o el campo no existe

DMA

unread,
Feb 27, 2012, 2:05:49 PM2/27/12
to web2py-...@googlegroups.com
¡¡¡¡Al fin!!!! Lo conseguí gracias a esta línea:

{{db.metas_usuarios[request.post_vars.id] = dict(titulo = request.post_vars.titulo, descripcion = request.post_vars.descripcion, fecha = request.post_vars.fecha, id_usuario = request.post_vars.id_usuario)}}

Gracias a los que habéis intentado ayudarme =)
Reply all
Reply to author
Forward
0 new messages