我正在尝试在我的应用中创建一个功能,用户可以将当前位置与其帐户相关联。用户可以添加多个位置,添加位置时,会将其添加为该用户的子级。为了允许用户设置他们的当前位置,我创建了一个表单,在表单中他们指定要将其设置为当前位置的位置。这个模板如下:
<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()类型之间的转换有关。
修改
这是错误的完整堆栈跟踪:
追踪(最近一次通话): 文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第744行,发出 msg = self.format(记录) 文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第630行,格式 return fmt.format(record) 文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第418行,格式 record.message = record.getMessage() getMessage中的文件“/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/logging/init.py”,第288行 msg = msg%self.args 在 str 中输入文件“/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/datastore_types.py”,第595行 '不能对不完整的密钥进行字符串编码!\ n%s'%self .__参考) BadKeyError:无法对不完整的密钥进行字符串编码!
答案 0 :(得分:0)
您需要包含完整的堆栈跟踪及其包含的代码以确定,但听起来您在生成表单时会收到异常,而不是在提交表单时。
如果您从对象获取.key()
并尝试在其上调用str()
,未指定密钥名称且尚未存储,则会出现您引用的异常数据存储区的实体。在尝试对密钥进行字符串化之前,请先调用实体.put()
。
答案 1 :(得分:0)
解决了它。问题是我将对当前位置的引用存储为db.Key类型而不是db.ReferenceProperty。