处理上传到Appengine Blobstore时的表单失败
我正在使用 @wkornewald 的 django-nonrel 和 django-filetransfer 在 Google App Engine 上。
我可以顺利上传文件,但只有在整个表单都有效的情况下。如果表单中的任何字段验证失败,它就会完全崩溃,而不是返回给用户让他们修正错误。
错误信息是:
INFO 2011-03-10 20:27:09,496 dev_appserver.py:535] Internal redirection to /admin/rr/member/add/
INFO 2011-03-10 20:27:09,662 dev_appserver_blobstore.py:328] Upload handler returned 200
ERROR 2011-03-10 20:27:09,662 dev_appserver_blobstore.py:341] Invalid upload handler response. Only 301, 302 and 303 statuses are permitted and it may not have a content body.
INFO 2011-03-10 20:27:09,680 dev_appserver.py:3317] "POST /_ah/upload/ag5kbXJvbGxpbnJlbGljc3IcCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGIkBDA HTTP/1.1" 500 -
我有一个简单的模型,长这样:
class Member(PhotoMixin, models.Model):
name = models.CharField(max_length=50)
name2 = models.CharField(max_length=50, blank=True)
member_since = models.DateField(blank=True, null=True)
full_size_image = models.FileField(verbose_name="Photo", upload_to='members/')
is_active = models.BooleanField(default=True)
有没有办法让我更优雅地处理这个问题?我觉得这可能是因为 django-filetransfers 希望你把表单提交到 blob 上传的 URL,而那个 URL 不知道在失败时该怎么处理。是否应该有一个中间步骤,处理大部分表单,并且只有在其他字段有效时才提交到上传的 URL?
1 个回答
2
blobstore API 要求上传处理程序的视图必须返回一个重定向。
正如上面发布的错误日志所说:
Only 301, 302 and 303 statuses are permitted and it may not have a content body.
为了解决这个问题,我修改了 ModelAdmin 的 add_view 和 change_view 方法,让它们在表单验证失败时返回一个重定向,同时附加上查询字符串,这样输入的值就不会丢失。
接下来,在处理 GET 请求时,我会检查查询参数中是否有 'failed_validation',这样就可以把表单数据发送到表单或表单集,以便触发验证。
相关代码可以在 bitbucket 上找到:https://aaronmadison@bitbucket.org/aaronmadison/django-filetransfers。
现在你可以上传到 blobstore 并处理错误了……太好了。