跳转到主要内容

django-attachments是一个通用的Django应用,可以将文件(附件)附加到任何模型。

项目描述

https://badge.fury.io/py/django-attachments.svg https://travis-ci.org/bartTC/django-attachments.svg?branch=master Codacy Badge https://api.codacy.com/project/badge/Coverage/e13db6df2a2148b08c662798642aa611

django-attachments

django-attachments是一组通用的模板标签,可以将任何类型的文件附加到模型。

安装

  1. attachments添加到您的django项目的settings.py中的INSTALLED_APPS

    INSTALLED_APPS = (
        ...
        'attachments',
    )
  2. 将附件urlpattern添加到您的urls.py

    url(r'^attachments/', include('attachments.urls', namespace='attachments')),
  3. 迁移您的数据库

    ./manage.py migrate
  4. 授予用户一些权限

    • 对于添加附件,授予用户(或组)attachments.add_attachment权限。

    • 对于删除附件,授予用户(或组)attachments.delete_attachment权限。这允许用户仅删除自己的附件。

    • 为了删除其他用户的附件,请授予用户“attachments.delete_foreign_attachments”的权限。

  5. 如果要在删除附件对象时从磁盘上删除文件,请将DELETE_ATTACHMENTS_FROM_DISK设置为True

  6. 配置FILE_UPLOAD_MAX_SIZE(可选)。这是在引发表单验证错误之前的最大字节大小。如果未设置,则不对文件大小进行限制。

请注意,您需要提供文件服务!

django-attachments将文件存储在您的site_media目录中,并不对其进行修改。例如,如果用户上传了一个.html文件,您的Web服务器可能将其显示为HTML。将这些文件作为纯文本提供是一个好主意。在Apache2配置中,这看起来像

<Location /site_media/attachments>
    AddType text/plain .html .htm .shtml .php .php5 .php4 .pl .cgi
</Location>

维护

django-attachments提供了delete_stale_attachments管理命令。它将删除所有相关对象不再存在的相关附件!系统管理员可以执行以下操作:

./manage.py delete_stale_attachments

您也可以通过cron执行此操作。

本地开发

使用pipenv安装本地开发环境。它为您创建一个虚拟环境,并从.env加载正确的ENV变量。

# pip install pipenv

$ pipenv install
Loading .env environment variables...
Installing dependencies from Pipfile.lock (a053bc)...
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.

测试

在本地环境中使用pipenv运行测试套件。

$ cd django-attachments/
$ pipenv install --dev
$ pipenv run pytest attachments/

或者使用tox针对不同的Django和Python版本进行测试

$ tox -r

您也可以通过调用带有测试应用设置的django-admin工具来调用测试套件或其他“manage.py”命令。

$ cd django-attachments/
$ pipenv install --dev
$ pipenv run test
$ pipenv run django-admin.py runserver
$ pipenv run django-admin makemigrations --dry-run

构建新版本

$ git tag
$ change version in setup.cfg
$ pip install -U setuptools
$ python setup.py sdist && python setup.py bdist_wheel --universal
$ twine upload --sign dist/*

用法

在contrib.admin

django-attachments为您的admin应用中任何类型的模型提供内联对象,以添加附件列表。

只需将AttachmentInlines添加到您的模型的admin选项中。示例

from django.contrib import admin
from attachments.admin import AttachmentInlines

class MyEntryOptions(admin.ModelAdmin):
    inlines = (AttachmentInlines,)
http://cloud.github.com/downloads/bartTC/django-attachments/attachments_screenshot_admin.png

在您的前端模板中

首先,在每个您想要使用它的模板中加载attachments_tags

{% load attachments_tags %}

django-attachments附带了一些templatetags,可以在前端为您的模型对象添加或删除附件。

  1. get_attachments_for [object]:获取给定模型实例的附件。您可以可选地定义一个变量名,其中在模板上下文中存储附件列表(这在Django 1.8中是必需的)。如果不定义变量名,则直接打印结果。

    {% get_attachments_for entry as attachments_list %}
  2. attachments_count [object]:计算给定模型实例的附件数量并返回一个整数

    {% attachments_count entry %}
  3. attachment_form:渲染一个上传表单以添加给定模型实例的附件。示例

    {% attachment_form [object] %}

    如果当前用户未登录,则返回一个空字符串。

  4. attachment_delete_link:渲染一个指向给定附件的删除视图的链接。示例

    {% for att in attachments_list %}
        {{ att }} {% attachment_delete_link att %}
    {% endfor %}

    此标签自动检查权限。如果给定附件的创建者是当前登录用户或用户具有delete_foreign_attachments权限,则返回一个HTML链接。

快速示例

{% load attachments_tags %}
{% get_attachments_for entry as my_entry_attachments %}

<span>Object has {% attachments_count entry %} attachments</span>
{% if my_entry_attachments %}
<ul>
{% for attachment in my_entry_attachments %}
    <li>
        <a href="{{ attachment.attachment_file.url }}">{{ attachment.filename }}</a>
        {% attachment_delete_link attachment %}
    </li>
{% endfor %}
</ul>
{% endif %}

{% attachment_form entry %}

{% if messages %}
<ul class="messages">
{% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {{ message }}
    </li>
{% endfor %}
</ul>
{% endif %}

设置

  • DELETE_ATTACHMENTS_FROM_DISK将在删除附件模型时删除附件文件。默认为False

  • FILE_UPLOAD_MAX_SIZE以字节为单位。拒绝超过此值的文件上传。默认未定义

  • AppConfig.attachment_validators - 一系列自定义表单验证函数,将针对上传的文件执行。如果其中任何一个引发ValidationError,则拒绝上传。默认为空。有关示例,请参阅attachments/tests/testapp/apps.py

变更日志

v1.11 (2023-04-20)

  • 当存在 X-Return-Form-Errors 请求头时,从 add_attachment() 视图中以 JSON 格式返回表单错误。响应代码是 400 - 错误请求,因为这属于客户端错误。

v1.10 (2023-04-14)

  • 通过 AppConfig.attachment_validators 支持自定义表单验证器

  • 移除“attachment_list”中的引号(Aaron C. de Bruyn)

  • 添加一个 URL 以匹配具有 UUID4 主键的对象。修复 问题 #94(Aaron C. de Bruyn)

  • 记录 django-attachments 支持的设置

  • 记录如何发布新版本。关闭 问题 #78

  • 开始使用 GitHub Actions 进行测试

  • 停止使用 Django 的过时版本进行测试

  • 添加对 Django 4.0 和 4.1 以及 Python 3.9 和 3.10 的测试,并将默认的 Python 版本切换到 3.10

  • 添加对 Python 3.11 的测试 - 目前仅在 Django 4.1 上受支持

v1.9.1 (2021-04-30)

  • 重建上一个版本,但不发送遗留的迁移文件

v1.9 (2021-04-29) – 已从 PyPI 中移除

v1.8 (2020-09-03)

  • object_idTextField() 更改为 CharField(max_length=64),并保留 db_index 参数。这解决了 MariaDB/MySQL 上的问题。

v1.7 (2020-08-31) - 在 MariaDB/MySQL 上损坏

  • object_idcreatedmodified 字段添加 DB 索引。

  • 添加 delete_stale_attachments 命令以删除对应对象已删除的附件。

  • 添加 Attachment.attach_to() 方法以在不同对象之间移动附件。

  • Django 3.1 兼容性和测试。

v1.6 (2020-08-17)

  • 支持相关对象的整数以外的主键(例如 UUIDs)。

v1.5 (2019-12-08)

  • 放弃对 Python 3.4 的支持。

  • 添加了对 Python 3.8 的支持。

  • Django 3.0 兼容性和测试。

  • Django 2.2 兼容性和测试。

v1.4.1 (2019-07-22)

  • templatetags 现在允许可选的 next 参数。

v1.4 (2019-02-14)

  • 放弃对 Django <=1.10 的支持。

  • 修复了‘next’ URL 参数重定向。

v1.3.1 (2019-01-24)

  • Django 2.1 和 Python 3.7 支持。

  • 通用代码清理。

v1.3 (2018-01-09)

  • 添加了缺失的数据库迁移。

  • 添加了新的模板标签 attachments_count

  • 添加了新的设置 DELETE_ATTACHMENTS_FROM_DISK,如果附件模型被删除,则删除附件文件。

  • 添加了新的设置 FILE_UPLOAD_MAX_SIZE,以拒绝超过此值的文件上传。

v1.2 (2017-12-15)

  • Django 1.11 和 2.0 兼容性和测试。

v1.1 (2017-03-18)

  • Django 1.10 兼容性和测试。

  • Python 3.6 兼容性和测试。

  • 修复了模型具有除“id”之外名称的外键的问题。

v1.0.1 (2016-06-12)

  • 添加了芬兰语翻译。

  • 对测试套件进行了小的改进。

v1.0 (2016-03-19)

  • 对代码进行了通用清理,以保持与最新 Django(目前为 1.8 及以上版本)的兼容性,以及与 Python3 的兼容性。引入了完整的测试套件。

  • 向后不兼容:附件视图现在使用 URL 模式 namespace,因此您需要调整 URL 模式

    url(r'^attachments/', include('attachments.urls', namespace='attachments')),
  • 向后不兼容:必须删除围绕 as 变量名的引号

    {% get_attachments_for entry as "my_entry_attachments" %}
    
    becomes
    
    {% get_attachments_for entry as my_entry_attachments %}
  • 可能向后不兼容:旧版本中存在关于

    权限尚未在所有地方强制执行。从现在起,相关权限 add_attachmentdelete_attachment 必须应用于所有相关用户。

v0.3.1 (2009-07-29)

  • 在README中添加了一条说明,建议您保护您的静态文件。

v0.3 (2009-07-22)

  • 本版本增加了对用户权限的更细粒度控制。您需要明确将权限添加到应能上传、删除或删除外部附件的用户。

    这可能是不兼容的,因为您之前不需要分配添加/删除权限!

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源分布

django-attachments-1.11.tar.gz (36.5 kB 查看散列值)

上传时间

构建分布

django_attachments-1.11-py2.py3-none-any.whl (36.0 kB 查看散列值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面