首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django admin "Preview PDF“按钮

Django admin "Preview PDF“按钮
EN

Stack Overflow用户
提问于 2012-05-19 08:18:54
回答 1查看 1.5K关注 0票数 2

在这项任务上非常需要帮助;已经苦苦思索了一天了。该功能是将管理员通过管理员界面编写的文本转换为用户可以通过web应用程序查看的PDF。

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

我正在通过覆盖模型中的save函数来解决这个问题。

代码语言:javascript
复制
@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。

老实说,我认为它是有效的,但现在它给了我一个

代码语言:javascript
复制
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

这可能是因为我在save方法中嵌套了事务?但我觉得我应该在这方面寻求更高的帮助,以防我遗漏了一些基本的东西,或者只是有一个简单的更好的方法来做到这一点。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-10 16:16:16

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

我会做得更简单-当点击"Preview PDF“按钮时,只需创建pdf并使用以下命令返回

代码语言:javascript
复制
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=preview.pdf'

#print PDF to response
return response

这将在您的浏览器中下载PDF,并且不会保存到数据库中。您可以预览它,当一切正常时-然后以常规方式保存它。只需将所有其他更改保存在数据库中,以便在重新加载页面时将它们保留在表单中。

另一种解决方案是为PDF文件实现文件状态字段,状态= " DRAFT | PUBLISHED ",并仅向用户显示已发布的版本,而DRAFT仅在Admin中可用...

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10661288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档