Pregunta

Estoy intentando mi primer proyecto del motor de aplicaciones de Google & # 8211; una base de datos de estadísticas de jugadores simple para un equipo deportivo en el que estoy involucrado. Teniendo en cuenta este modelo:

class Player(db.Model):
    """ Represents a player in the club. """

    first_name = db.StringProperty()
    surname = db.StringProperty()
    gender = db.StringProperty()

Quiero crear una interfaz web básica para crear y modificar jugadores. Mi estructura de código se parece a esto:

class PlayersPage(webapp.RequestHandler):
    def get(self):
        # Get all the current players, and store the list.
        # We need to store the list so that we can update
        # if necessary in post().
        self.shown_players = list(Player.all())

        # omitted: html-building using django template

Este código produce una página HTML muy básica que consta de un formulario y una tabla. La tabla tiene una fila para cada jugador, parecida a esto:

  <tr>
    <td><input type=text name="first_name0" value="Test"></td>
    <td><input type=text name="surname0" value="Guy"></td>
    <td><select name="gender0">
        <option value="Male" selected>Male</option>
        <option value="Female" >Female</option>
      </select></td>
  </tr>
  <!-- next row: first_name1, etc. -->

Mi idea es que almacene las instancias de Player que utilicé en self.shown_players, para que luego pueda actualizar a Players en mi método post () (de la misma clase) de haciendo:

def post(self):
    # some code skipped

    for i, player in enumerate(self.shown_players):
        fn = self.request.get('first_name'+str(i)).strip()
        sn = self.request.get('surname'+str(i)).strip()
        gd = self.request.get('gender'+str(i)).strip()
        if any([fn != player.first_name,
                sn != player.surname,
                gd != player.gender]):
            player.first_name = fn
            player.surname = sn
            player.gender = gd
            player.put()

Sin embargo, esto no funciona porque self.shown_players no existe cuando se llama al método post () . Supongo que el motor de la aplicación crea una nueva instancia de la clase cada vez que se accede a la página.

Experimenté con la misma idea, pero puse shown_players a nivel de clase o módulo (y lo llamé global ) pero esto no funcionó por razones que no puedo adivinar . Por ejemplo:

shown_players = []
class PlayersPage(webapp.RequestHandler):
    def get(self):
        # Get all the current players, and store the list.
        # We need to store the list so that we can update
        # if necessary in post().
        global shown_players
        shown_players[:] = list(Player.all())

shown_players parece tener el valor correcto dentro de get () porque el HTML se genera correctamente, pero está vacío dentro de post () .

¿Qué debo hacer?

EDITAR: Gracias, todos. La respuesta ("¡Recuperar a los jugadores otra vez! & Quot;) debería haber sido obvia :-) Tal vez miraré memcache algún día, pero no espero que la lista de jugadores llegue a más de 30 en un futuro cercano ...

¿Fue útil?

Solución

En cada solicitud, está trabajando en una nueva instancia de la misma clase. Es por eso que no puede crear una variable en get () y usar su valor en post () . Lo que podría hacer es recuperar los valores nuevamente en su método post () o almacenar los datos en el memcache .

Consulte la documentación de memcache aquí:

http://code.google.com/ intl / de-DE / appengine / docs / python / memcache /

Otros consejos

En su método de publicación, justo antes de " para " cláusula, recuperar la lista de jugadores desde donde está almacenada:

def post(self):
    # some code skipped

    self.shown_players = Player.all().fetch()
    for i, player in enumerate(self.shown_players):
      ...

Nunca he intentado crear una aplicación de motor de aplicación de Google, pero entiendo que es algo similar a Django en el manejo de bases de datos, etc.

No creo que debas almacenar cosas en variables globales y, en cambio, deberías tratar cada transacción por separado. La solicitud de obtención funciona porque está haciendo lo que debería hacer y vuelve a solicitar la información de la base de datos.

Si desea actualizar un jugador en su función de publicación, probablemente quiera pasar los detalles, [buscar jugadores con esos detalles de nuevo] , modifíquelos como desee. El bit entre paréntesis es el paso que te falta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top