Buenas, estoy jugando un poco con google App Engine y plantillas Django, y me he propuesto escribir un protoservicio de chat.
El caso es que me ha surgido un problema a la hora de hacer llamadas a la base de datos y recuperar los mensajes para imprimirlos en la textarea html. El problema es que una vez hecha la llamada, se crea un objeto, pero no reconoce la propiedad 'mensaje', que es la que tiene el texto mismo del mensaje.
import wsgiref.handlers
import os
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext import db
from google.appengine.ext.webapp import util
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
class MainHandler(webapp.RequestHandler):
def get(self):
user = users.get_current_user()
mensajes = db.GqlQuery('SELECT * FROM Mensaje')
if user:
if mensajes.mensaje: ##Comprueba si hay mensajes en el objeto mensaje
nickname = user.nickname()
template_values = {'nickname' : nickname,
'mensaje' : mensajes,}
greeting = self.response.out.write(template.render('main.html', template_values))
else:
greeting = self.response.out.write('El problema es con la base de datos')
else:
greeting = ("<html><body><a href=\"%s\">Sign in or register</a></body></html>." %
users.create_login_url("/"))
self.response.out.write(greeting)
def post(self):
textomensaje = self.request.get('txtboxMsg') ##Esto guerda el mensaje
mensaje = Mensaje(mensaje = textomensaje) ##en la base de datos,
mensaje.put() ##funciona bien (comprobado)
self.redirect('/')
class Mensaje(db.Model):
mensaje = db.StringProperty(required = True)
hora = db.DateTimeProperty(auto_now_add = True)
def main():
application = webapp.WSGIApplication([('/', MainHandler)],
debug=True)
util.run_wsgi_app(application)
if __name__ == '__main__':
main()
Aqui esta el simple codigo del programa
Seguro que esa consulta esta devolviendo algo?
Intenta cambiando esto
mensajes = db.GqlQuery('SELECT * FROM Mensaje').fetch()
En tu code estas guardando la consulta, pero no la estas ejecutando, y tengo mis dudas de si se retorna con solo verificar verificar la propiedad mensaje.
Saludos
ya lo he intentado así, pero me da da error ('list' object has no attribute 'mensaje').
Además, en el ejemplo de Google http://code.google.com/intl/es-AR/appengine/docs/python/gettingstarted/usingdatastore.html (http://code.google.com/intl/es-AR/appengine/docs/python/gettingstarted/usingdatastore.html) y en el video demostrativo [youtube=425,350]http://www.youtube.com/watch?v=bfgO-LXGpTM[/youtube] no usa el comando .fetch() y funciona.
Gracias por tomarte interés y responder tan rapido.
salu2, kerith
Claaaaaaaaaro! no me había dado cuenta ;D
mensajes es una lista, por lo que la lista no tiene la propiedad mensaje, lo que tiene la propiedad mensaje son los elementos de esa lista :P
Por ej:
mensajes = db.GqlQuery('SELECT * FROM Mensaje')
#si funciona sin fetch, entonces no lo ponemos :P
print mensajes[0].mensaje
Saludos
Diosss, llevo más de 6 horas con el mismo problema, y sin darme cuenta de que era una lista!! (en estos momentos me siento a medio camino entre la estupidez y el noobismo XD).
Muchas gracias por descubrirlo, ahora tengo que encontrar la manera de incluirlo en la platilla de Django.
salu2, kerith
Eso no debería de dar trabajo, no has revisado esto? :P
http://code.google.com/p/google-app-engine-samples/
Saludos
Muchísimas gracias por todo, ya he solucionado el problema.
Si alguien quiere el código fuente no tiene más que pedirlo.
salu2, kerith