处理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或DraftModelAdminfrom 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 |