2012-05-19 71 views
2

拼命地需要帮助完成此任务;现在已经侵入了它一天。其功能是将管理员通过管理界面编写的文本转换为用户可以通过Web应用程序查看的PDF。Django管理员“预览PDF”按钮

除了我希望能够看到在实际发布之前生成的PDF之外,该功能已经实现。所以在管理界面中,我正在创建一个“预览PDF”按钮。从本质上讲,它将保存当前表单(有新的更改)生成PDF,以便可以看到更改,并回滚到原始状态,以便外部世界不会看到变化。

我正在通过覆盖模型中的保存功能来解决问题。

@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 

这是因为我在保存方法嵌套事务的可能?但我觉得我应该寻求更高的帮助,以防万一我错过了一些基本的东西,或者只有一个简单的高级方法。

任何帮助非常感谢,谢谢!

回答

3

这似乎是一个非常复杂的方法 - 这样你就可以创建一个保存点,并且永不提交/回滚到数据库,这可能会导致数据库锁定(如你的例子)。

我会做更简单 - 打“预览PDF”按钮时,只需要创建的PDF和使用

response = HttpResponse(mimetype='application/pdf') 
response['Content-Disposition'] = 'attachment; filename=preview.pdf' 

#print PDF to response 
return response 

这将下载PDF浏览器中的退货,也没有储蓄会发生成DB。你可以预览它,当一切都看起来不错时 - 然后以常规方式保存。只需保存数据库中的所有其他更改,以便在重新加载页面时将其保留在表单中。

另一种解决办法是实现文件的状态字段为PDF文件,用状态=“草稿|发表”,并展现给用户的唯一已公布的版本,而草案中只联系提供...

+0

第一个解决方案的问题是我需要提供预览PDF中的最新更改,所以我需要在保存PDF文件之前将其保存,然后再回滚。然而,我确实实施了第二个建议。每个实例都有一个状态字段,视图表只呈现“已发布”的PDF。谢谢! – Rawkcy

+0

如果不起作用,请尝试:'content_type ='application/pdf'' – swietyy