سؤال

وأنا محاولة أول مشروع محرك جوجل التطبيق بلدي - لاعب بسيط احصائيات قاعدة بيانات لفريق رياضي أنا أشارك مع. ونظرا لهذا النموذج:

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

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

وأريد أن واجهة ويب الأساسية لإنشاء وتعديل اللاعبين. هيكل قانون بلدي يبدو شيئا من هذا القبيل:

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

وهذا الرمز ينتج صفحة HTML بسيطة للغاية يتكون من شكل وطاولة. يحتوي الجدول على صف واحد لكل لاعب، تبدو وكأنها شيء من هذا القبيل:

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

وفكرتي هي أن وأود أن تخزين حالات لاعب التي استعملتها في self.shown_players، كي أتمكن في وقت لاحق تحديث اللاعبين إذا لزم الأمر في بلدي طريقة post() (من نفس الفئة) عن طريق القيام:

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

ولكن، هذا لا يعمل بسبب عدم وجود self.shown_players عندما يتم استدعاء أسلوب post(). اعتقد ان محرك التطبيق يخلق مثيل جديد من فئة كل مرة كانت الصفحة الوصول إليها.

وأنا جربت مع نفس الفكرة ولكن وضع shown_players على مستوى الفئة أو وحدة نمطية (واصفا إياه global) ولكن لم يكن هذا العمل لأسباب لا أستطيع الإلهي. على سبيل المثال:

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 يبدو أن قيمة الحق في get() لأن HTML يولد بشكل صحيح، ولكن كان فارغا داخل post().

وماذا علي أن أفعل؟

وتحرير: شكرا، جميع. الجواب ( "مجرد استرداد اللاعبين مرة أخرى!") كان ينبغي أن يكون واضحا :-) ربما سوف ننظر في memcache يوم واحد، ولكن لا أتوقع قائمة لاعب لتجاوز 30 في المستقبل القريب ..

هل كانت مفيدة؟

المحلول

في كل طلب كنت تعمل على نسخة جديدة من نفس الفئة. هذا هو السبب الذي لا يمكن إنشاء varable في get() واستخدام قيمته في post(). ما يمكن القيام به هو إما استرداد القيم مرة أخرى في حياتك post()-طريقة أو تخزين البيانات في memcache.

والرجوع إلى وثائق من memcache هنا:

http://code.google.com/ تي / دي-DE / إلى AppEngine / مستندات / الثعبان / memcache /

نصائح أخرى

في أسلوب آخر، ما عليك سوى قبل "ل" بند، استرداد قائمة اللاعبين من حيث يتم تخزينها:

def post(self):
    # some code skipped

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

ولقد حاولت أبدا بناء التطبيق محرك جوجل التطبيق، ولكن أنا أفهم أنها تشبه إلى حد ما جانغو في انها التعامل مع قواعد البيانات وغيرها.

وأنا لا أعتقد أنك يجب تخزين الأشياء في المتغيرات العالمية وبدلا من ذلك يجب معالجة كل معاملة على حدة. طلب الحصول على عمل لأنك تفعل ما يجب أن تفعله وإعادة طلب المعلومات من ديسيبل.

إذا كنت ترغب في تحديث لاعب في آخر وظيفة الخاص بك، وربما كنت تريد تمرير في التفاصيل، <م> [بحث عن لاعبين مع تلك التفاصيل مرة أخرى] ، أو تعديلها، كما يحلو لك. بت بين قوسين هو خطوة كنت في عداد المفقودين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top