BadKeyError при публикации ключей из формы HTML - PullRequest
0 голосов
/ 03 февраля 2011

Я пытаюсь создать функцию в своем приложении, в которой пользователь может связать текущее местоположение со своей учетной записью. Пользователи могут добавлять несколько местоположений, и когда добавляется местоположение, оно добавляется как дочерний элемент этого пользователя. Чтобы позволить пользователю установить свое текущее местоположение, я создал форму, в которой он указывает, какое местоположение он хочет установить в качестве своего текущего местоположения. Шаблон для этого выглядит следующим образом:

<form action="setlocation" method="post">
<table id="locationform" class="fitted">
    <tr>
        <td colspan="3"><b>Location settings</b></td>
    </tr>
    <tr>
        <td class="label">Current location</td>
        <td class="input">
            <select name="lockey">
                {% for i in locinfo %}
                    <option value="{{i.key}}">{{i.locname}}</option>
                {% endfor %}
            </select>
        </td>
        <td><input type="submit" value="Set Location"></td>
    </tr>
    <tr>
        <td colspan="3"><a href="/addlocation">Add new location</a></td>
    </tr>
</table>
</form>

Таким образом, значение каждого выбора является ключом для этого местоположения. Форма отправляет в / setlocation, которая обрабатывается следующим образом:

class SetLocation(BaseHandler):
    def post_secure(self):
        userdata = db.GqlQuery("SELECT * FROM User WHERE fbid = :1", self.user['uid'])[0]
        userdata.currentloc = self.request.get('lockey')
        logging.warn("Current location saved")
        userdata.put()
        self.redirect('/account')

... однако, когда я иду в хранилище данных, значение currentloc не имеет значения. В обработчике для / account я поместил строку для регистрации ключа currentloc пользователя и получил в журнале сообщение об ошибке «BadKeyError: Невозможно закодировать строку как неполный ключ!». Я не вижу, где ключ был изменен по пути, поэтому я думаю, что это связано с преобразованием между строками (для страницы) и типом db.Key ().

EDIT

Это полная трассировка стека ошибки:

Traceback (последний вызов был последним): Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py", строка 744, в emit msg = self.format (запись) Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py", строка 630, в формате вернуть fmt.format (запись) Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py", строка 418, в формате record.message = record.getMessage () Файл "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py", строка 288, в getMessage msg = msg% self.args Файл "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore_types.py", строка 595, в str 'Нельзя строковое кодирование неполного ключа! \ N% s' ссылка на% self .__) BadKeyError: Невозможно закодировать строку в виде неполного ключа!

Ответы [ 2 ]

0 голосов
/ 07 февраля 2011

Решил это.Проблема заключалась в том, что я хранил ссылку на текущее местоположение как тип db.Key, а не db.ReferenceProperty.

0 голосов
/ 04 февраля 2011

Вы должны включить полную трассировку стека и код, в который она включена, чтобы быть уверенным, но похоже, что вы получаете исключение при создании формы, а не при ее отправке.

Исключение, на которое вы ссылаетесь, возникает, если вы извлекаете .key() из объекта и пытаетесь вызвать str() для него, когда вы не указали имя ключа и еще не сохранилисущность в хранилище данных.Вызовите .put() для объекта, прежде чем пытаться преобразовать ключ в ключ.

...