可扩展字段,允许Django应用将数据存储在您的模型中。
项目描述
可扩展字段和相关工具,使Django应用能够扩展可重用应用。
重要说明
此应用是原始的 Django appdata 的分支。分支创建的原因是原始应用程序与最新版本的Django不正确工作,并且对拉取请求的反应非常慢。然而,如果您可以的话,我推荐使用原始应用程序。
动机
在与可重用Django应用一起工作时,我们经常发现我们需要向模型或应用程序提供的表单中添加一些额外内容。一些应用程序通过提供灵活的模型定义和可插拔的表单(例如,参见 django.contrib.comments)来尝试解决这个问题,但即使如此,也会导致一些重复的工作。
django-appdata 应用通过 AppDataField、MultiForm 和 AppDataModelAdmin,尝试提供扩展现有应用程序的标准方法。
扩展模型
当您使用 AppDataField 的可扩展Django应用时
from django.db import models from app_data import AppDataField class BlogPost(models.Model): text = models.TextField() app_data = AppDataField()
您的代码可以在任何(或所有)AppDataField 上注册一个命名空间,并通过注册一个 容器(AppDataContainer 的子类)来存储自己的数据。要定义数据,您使用Django的表单框架
from django.forms.models import ModelMultipleChoiceField from app_data import app_registry, AppDataForm, AppDataContainer from .models import Tag class TaggingAppDataForm(AppDataForm): public_tags = ModelMultipleChoiceField(Tag.objects.all()) admin_tags = ModelMultipleChoiceField(Tag.objects.all()) class TaggingAppDataContainer(AppDataContainer): form_class = TaggingAppDataForm def tag_string(self): print ', '.join(t.name for t in self.public_tags) app_registry.register('tagging', TaggingAppDataContainer)
这应该使您能够在任何定义的 AppDataField 中访问 ‘tagging’ 命名空间
from blog_app.models import BlogPost bp = BlogPost() assert bp.app_data.tagging.tag_string() == ""
附加选项
请注意,如果您不需要在容器中添加自定义方法,只需使用工厂来创建子类即可。
app_registry.register('tagging', AppDataContainer.from_form(TaggingAppDataForm))
此外,您还可以将注册限制为给定的模型。
from blog_app.models import BlogPost app_registry.register('tagging', TaggingAppDataContainer, BlogPost)
扩展表单
django-appdata 提供了一个 MultiForm 类 - 它是围绕 django 的 ModelForm 的包装器,并可选地添加了与模型中 AppDataField 注册的命名空间对应的子表单。通常,可扩展的应用程序会创建并使用 MultiForm 而不是常规的 ModelForm。
from app_data.forms import multiform_factory from .models import BlogPost BlogPostMultiForm = multiform_factory(BlogPost)
当使用该应用程序时,任何项目都可以向该 MultiForm 添加额外的子表单。
from blog_app.forms import BlogPostMultiForm BlogPostMultiForm.add_form('tagging', {'fields': ['public_tags']})
这样,当可重用应用程序的代码保持不变时,我们可以在其处理过程中注入额外的表单逻辑。
附加选项
任何参数和关键字参数都未经更改地传递给 ModelForm 类,该类是 MultiForm 包装的,因此即使您为 ModelForm 提供了自定义参数,一切仍然可以正常工作。
from django.forms.models import BaseModelForm class ModelFormWithUser(ModelForm): def __init__(self, user, *args, **kwargs): self.user = user super(ModelFormWithUser, self).__init__(*args, **kwargs) BlogPostMultiForm = multiform_factory(BlogPost, form=ModelFormWithUser)
当然,您不仅限于使用工厂函数。
from app_data import MultiForm class MyMultiForm(MultiForm): ModelForm = BlogPostModelForm
多表单在管理界面中
如果您希望将您自己的代码添加到管理界面中,请使用 AppDataModelAdmin。
from django.contrib import admin from app_data.admin import AppDataModelAdmin from blog_app.models import BlogPost class BlogPostAdmin(AppDataModelAdmin): # due to bug in django's admin validation we need to use # declared_fieldsets instead of just fieldsets declared_fieldsets = [ (None, {'fields': ['text', ]}), ('Tagging', {'fields': [('tagging.public_tags', 'tagging.admin_tags')]}) ] admin.site.register(BlogPost, BlogPostAdmin)
附加选项
与 django 的管理和表单一样,您可以通过使用 AppDataModelAdmin 的 multiform 属性来提供自己的 MultiForm 类。
幕后
django-appdata 使用 TextField 通过 JSON 存储模型上的数据,并使用 django 的表单框架进行(反)序列化和数据验证。
当我们访问字段中的容器时,我们将尝试在注册表中定位适当的容器。如果没有找到,如果有(字典),则返回原始数据。为了确保一切正常工作,我们建议在项目中进行某种类型的初始化代码,以确保在运行任何实际代码之前完成所有注册。我们在应用程序中使用了一个名为 register 的模块,然后使用类似于管理员的自动发现的一些代码来遍历已安装的应用程序并加载此模块。
构建状态
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪一个,请了解有关 安装包 的更多信息。
源分布
构建分布
哈希 对于 django_appdata_mam-0.1.7-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f3d66e8863006ff1db2a4390774aa5049797265d0ceabe6444e860113a7860e8 |
|
MD5 | b9e08a9f6adb8a9c5329e9f308386c40 |
|
BLAKE2b-256 | 3b45abdbe20ff0bc1f7de54ddedbf60ee8ef49734aca0c0d4b79b54494cbf6cb |