在这项任务上非常需要帮助;已经苦苦思索了一天了。该功能是将管理员通过管理员界面编写的文本转换为用户可以通过web应用程序查看的PDF。
该功能已经实现,除非我希望在实际发布之前能够看到我将生成的PDF。因此,在管理界面中,我希望创建一个“预览PDF”按钮。本质上,它将保存当前表单(具有新的更改),生成PDF,以便可以看到更改,并回滚到原始状态,因此外部世界看不到任何更改。
我正在通过覆盖模型中的save函数来解决这个问题。
@transaction.commit_manually
def save(self, force_insert=False, force_update=False, using=None):
super(Doc, self).save(force_insert=force_insert, force_update=force_update, using=using)
if self.preview:
from lava_server.settings import common
# make a copy
doc_copy = self
doc_copy.id = None
# Prevent loopback
doc_copy.preview = False
transaction.rollback()
doc_copy.save()
common.TEMP_PDF_ID = doc_copy.id
else:
transaction.savepoint_commit(sid)我还覆盖了response_change和response_add,以重定向到呈现PDF的视图。视图在渲染后删除doc_copy。
老实说,我认为它是有效的,但现在它给了我一个
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK这可能是因为我在save方法中嵌套了事务?但我觉得我应该在这方面寻求更高的帮助,以防我遗漏了一些基本的东西,或者只是有一个简单的更好的方法来做到这一点。
任何帮助都非常感谢,谢谢!
发布于 2012-06-10 16:16:16
这似乎是一种非常复杂的方法--这样您就可以创建一个保存点,并且永远不会将其提交/回滚到DB中,这可能会导致数据库锁定(如您的示例所示)。
我会做得更简单-当点击"Preview PDF“按钮时,只需创建pdf并使用以下命令返回
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=preview.pdf'
#print PDF to response
return response这将在您的浏览器中下载PDF,并且不会保存到数据库中。您可以预览它,当一切正常时-然后以常规方式保存它。只需将所有其他更改保存在数据库中,以便在重新加载页面时将它们保留在表单中。
另一种解决方案是为PDF文件实现文件状态字段,状态= " DRAFT | PUBLISHED ",并仅向用户显示已发布的版本,而DRAFT仅在Admin中可用...
https://stackoverflow.com/questions/10661288
复制相似问题