Domanda

Sto tentando il mio primo progetto per il motore di app di Google: un semplice database delle statistiche dei giocatori per una squadra sportiva con cui sono coinvolto. Dato questo modello:

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

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

Voglio creare un'interfaccia web di base per creare e modificare giocatori. La mia struttura del codice è simile a questa:

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

Questo codice produce una pagina HTML di base composta da un modulo e una tabella. La tabella ha una riga per ogni giocatore, simile a questa:

  <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. -->

La mia idea è che avrei archiviato le istanze di Player che ho usato in self.shown_players, in modo da poter successivamente aggiornare i Giocatori nel mio metodo post () (della stessa classe) di facendo:

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()

Tuttavia, questo non funziona perché self.shown_players non esiste quando viene chiamato il metodo post () . Immagino che il motore dell'app crei una nuova istanza della classe ogni volta che si accede alla pagina.

Ho sperimentato la stessa idea ma mettendo shows_players a livello di classe o modulo (e chiamandolo globale ) ma questo non ha funzionato per ragioni che non posso divinare . Ad esempio:

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())

mostrati_ giocatori sembra avere il giusto valore in get () perché l'HTML viene generato correttamente, ma è vuoto in post () .

Cosa devo fare?

EDIT: grazie a tutti. La risposta (" Recupera di nuovo i giocatori! & Quot;) avrebbe dovuto essere ovvia :-) Forse guarderò memcache un giorno, ma non mi aspetto che la lista dei giocatori supererà i 30 nel prossimo futuro ..

È stato utile?

Soluzione

Ad ogni richiesta stai lavorando su una nuova istanza della stessa classe. Ecco perché non puoi creare una variabile in get () e usare il suo valore in post () . Quello che potresti fare è recuperare nuovamente i valori nel tuo metodo post () o archiviare i dati nel memcache .

Fare riferimento alla documentazione di memcache qui:

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

Altri suggerimenti

Nel tuo metodo post, subito prima del " per " clausola, recupera l'elenco dei giocatori da dove è memorizzato:

def post(self):
    # some code skipped

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

Non ho mai provato a creare un'app per motori di app di Google, ma capisco che sia in qualche modo simile a Django nella gestione dei database ecc.

Non credo che dovresti archiviare le cose in variabili globali e invece dovresti trattare ogni transazione separatamente. La richiesta get funziona perché stai facendo quello che dovresti fare e richiedi nuovamente le informazioni dal db.

Se vuoi aggiornare un giocatore nella tua funzione post, probabilmente vuoi passare i dettagli, [cerca di nuovo i giocatori con quei dettagli] , modificali come preferisci. Il bit tra parentesi è il passaggio che ti manca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top