在 Django 管理界面中链接以直接从数据库中下载模型字段

Posted

技术标签:

【中文标题】在 Django 管理界面中链接以直接从数据库中下载模型字段【英文标题】:Link in Django admin interface to directly download model field from database 【发布时间】:2012-07-18 02:16:22 【问题描述】:

我将二进制文件作为 base64 编码字符串存储在模型的 TextField() 中。我是这样做的:

class Foo(models.Model):
  _data = models.TextField(db_column='data', blank=True)

  def set_data(self, data):
    self._data = base64.encodestring(data)

  def get_data(self):
    return base64.decodestring(self._data)

  data = property(get_data, set_data)

(from this snippet).

如何提供从 Django 管理界面(最好是从模型实例的更改/编辑页面)下载这些文件(解码后)的链接?

我可以解码它们并将它们显示在页面上 - 就像任何其他模型字段一样 - 但它要么不显示,要么就是垃圾,因为它们是二进制文件。我想提供一个下载链接。

我可以在谷歌上搜索到的关于 Django 文件的大部分信息都假设我正在接受用户上传,或者我想直接从网络服务器提供静态(媒体)文件。也不是这样。我的文件很小,不经常使用,并且仅用于管理用途,因此直接将它们存储在数据库中或让 Django 自己提供它们并没有什么坏处。

【问题讨论】:

【参考方案1】:

查看 ModelAdmin.get_urls(self) 的文档:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls

有一个如何将视图添加到 ModelAdmin 对象的示例。您的自定义视图应该返回一个响应,其中内容是您存储的 base64 数据(尽管您可能希望将其从 base64 转换回二进制)。

然后您可以覆盖该模型的管理模板以包含指向您的自定义视图的链接:https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates

【讨论】:

谢谢!我能够添加为下载返回 HttpResponse 的自定义视图。至于链接,我最初让它覆盖了管理模板,但我发现我可以在 ModelAdmin 中的“list_display”中添加一个字段(称为你喜欢的,例如“download_link”),然后定义一个同名的函数返回指向下载的 URL。这也适用于 Admin Inline 类(虽然我不得不粘贴两次代码,不是很干?)。 Details here(字段不必是外键)

以上是关于在 Django 管理界面中链接以直接从数据库中下载模型字段的主要内容,如果未能解决你的问题,请参考以下文章

Django 表单(中下)- 自定义钩子进行数据验证

Django站点管理——管理站点

django 1.9 + 自定义管理界面

Django1.11.4中文文档

如何在 django 管理页面上创建锚点以自动从 url 向下滚动到内联或字段

62.django站点管理