处理django模型草稿和发布状态
项目描述
Django-brouillons
处理Django ORM中模型的“草稿”和“公共”版本。
此模块仍在开发中,如果您不知道自己在做什么,则不应在生产环境中使用。此模块旨在处理一个相当复杂的问题,需要您为项目添加单元测试,以确保它在特定情况下确实做了您期望的事情。目前,我们知道该模块没有涵盖所有模型树复制的案例,但我们希望随着时间的推移增加这些案例。
它内部使用django-clone来复制Django ORM模型。我们建议您在深入研究django-brouillons
之前先了解django-clone
的工作原理。
它是如何工作的?
Django-brouillons
复制了旨在在两个版本public
和draft
中审核的给定模型的对象。
然后可以发布draft
版本,以便其值更新到public
版本。
贡献
请随时通过主页对该模块提供反馈。
有关贡献,请参阅CONTRIBUTING.md。
安装
-
从PyPI安装模块
python3 -m pip install django-brouillons
或者,如果您正在使用poetry
poetry add django-brouillons
-
将其添加到您的
INSTALLED_APPS
"django_brouillons",
配置
在您的模型中
-
要处理Django模型中的
draft
和public
状态,请从DraftModel
类继承from django_brouillons.models import DraftModel class DraftableObject(DraftModel): ...
-
然后您需要配置模型的 django-clone 设置,这将描述关于模型相关字段应采用的策略(对于
多对多
、外键
、一对一
等)。from django_brouillons.models import DraftModel class DraftableObject(DraftModel): _clone_m2o_or_o2m_fields = ["draftable_object_many_to_many2_through"] _clone_linked_m2m_fields = ["many_to_many_objects"] ... many_to_many_objects = models.ManyToManyField("DraftableObjectManyToMany") many_to_many_2_objects_through = models.ManyToManyField( "DraftableObjectManyToMany2", through="DraftableObjectManyToMany2Through", through_fields=("draftable_object", "draftable_object_many_to_many_2"), )
例如,您可以查看 测试应用模型。
在此示例中,将应用以下内容
many_to_many_objects
字段:m2m
字段将引用相同的关联对象,而不会重复关联对象draftable_object_many_to_many2_through
字段:设计为draftable_object_many_to_many2_through
相关名称的表的关联对象将被重复
-
如果您的模型包含一些具有
unique=True
的CharFields
字段,则必须在模型的Draft
版本中对它们进行前缀,以确保它们在Public
和Draft
版本之间保持唯一。这可以通过填充从
DraftModel
抽象模型继承的模型的_draft_prefixed_fields
属性来完成from django_brouillons.models import DraftModel class DraftableObject(DraftModel): _clone_m2o_or_o2m_fields = ["draftable_object_many_to_many2_through"] _clone_linked_m2m_fields = ["many_to_many_objects"] _draft_prefixed_fields = ["slug"] slug = models.SlugField(max_length=255, unique=True)
在此示例中,DraftableObject
包含一个唯一的 slug
字段。
将其列在 _draft_prefixed_fields
属性中指示 django-brouillons
在 draft
重复时必须使用 _draft_prefix
属性的值进行前缀。
在管理界面中
Django-brouillon 提供了 管理集成。
-
模型管理器可以继承自
DraftModelAdminMixin
或DraftModelAdmin
from django_brouillons.admin import DraftModelAdminMixin @admin.register(DraftableObject) # Must be referenced to allow autocomplete class DraftableObjectAdmin( DraftModelAdmin ): pass
这样做,将在您的管理模型更改视图中添加几个按钮
- 在管理界面中导航到对象的
Public
和Draft
版本 - 将对象的
draft
版本发布为public
版本 - 创建一个仅具有
public
的对象draft
版本
- 在管理界面中导航到对象的
-
DraftModelAdminMixin
在其list_filter
属性中包含一个PublishedChangesListFilter
过滤器,该过滤器添加了过滤未发布更改或未更改的对象的能力如果需要,可以手动在
list_filter
中设置此过滤器from django_brouillons.admin import DraftModelAdminMixin, PublishedChangesListFilter @admin.register(DraftableObject) # Must be referenced to allow autocomplete class DraftableObjectAdmin( DraftModelAdmin ): list_filter = (PublishedChangesListFilter,)
模型 API
Django-brouillons 在其模型属性中提供了以下内容
DraftableObject.is_public
:指示当前实例是否为公共实例DraftableObject.is_draft
:指示当前实例是否为草稿DraftableObject.has_public_version
:指示当前实例是否有公共版本DraftableObject.has_draft_version
:指示当前实例是否有草稿版本DraftableObject.has_unpublished_changes
:指示当前实例是否有待发布的更改DraftableObject.create_draft()
:从公共版本创建草稿DraftableObject.publish_draft()
:在公共版本中发布草稿版本的更改- 如果没有存在,则创建并返回新的
public_version
- 如果已存在,则更新并返回
public_version
- 如果没有存在,则创建并返回新的
测试
测试位于 tests
包中。
测试是用 pytest 编写的。它们基于 testapp 模型
要运行测试,必须启动命令 ./launch_tests.sh
可以使用命令 ./run_coverage.sh 生成覆盖率报告
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分布
构建分布
django_brouillons-0.0.4.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 38abbc4e1a76bf644ece5184ca6268b18fa970dda790928c8c54a24ba28b3f87 |
|
MD5 | bc93652dbbe91416029c50f3117cafb5 |
|
BLAKE2b-256 | e791c44e06171bb71d4cf956ec386dcd42102485b37767725d83232a142bb437 |
django_brouillons-0.0.4-py3-none-any.whl 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 6e147363af59c0ee908db910f9ceace04c1ac38c61e1b5c95655e7b1f3275494 |
|
MD5 | 8bdadd5a185fa67c451e127a8a2124a6 |
|
BLAKE2b-256 | a27bbe2233eac1c0e00c2c443d42c6964a7ac3d5331beb541dab9096dfabaa0f |