可扩展字段,允许Django应用在您的模型上存储其数据。
项目描述
可扩展字段和相关工具,使Django应用能够扩展您的可重用应用。
动机
在与可重用Django应用一起工作时,我们经常发现我们需要在应用提供的模型或表单中添加一些额外内容。一些应用通过提供灵活的模型定义和可插入的表单(例如,参见django.contrib.comments中这种方法的示例)来尝试解决这个问题,但即使如此,也会导致一些工作重复。
django-appdata应用通过AppDataField、MultiForm和AppDataModelAdmin,尝试提供一个标准化的方法来扩展现有应用。
支持版本
Python:3.9,3.10,3.11 Django:3.2,4.2
升级到0.4
如果您正在从0.3.x版本升级,请注意0.4中的以下不兼容更改
删除Django < 3.2和Python < 3.9兼容性
扩展模型
当您使用带有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 the behavior of django admin validation we need to use # get_fieldsets instead of just fieldsets def get_fieldsets(self, request, obj=None): return [ (None, {'fields': ['text', ]}), ('Tagging', {'fields': [('tagging.public_tags', 'tagging.admin_tags')]}) ] admin.site.register(BlogPost, BlogPostAdmin)
附加选项
与Django的管理和表单一样,您可以通过使用AppDataModelAdmin的multiform属性来提供自己的MultiForm类。
幕后
django-appdata使用JSON和Django的表单框架(用于数据的序列化和验证)在模型上使用TextField来存储数据。
在访问字段中的容器时,我们将尝试在注册表中定位合适的容器。如果没有找到,如果存在(字典),将返回普通数据。为确保一切正常工作,我们建议为您的项目放置某种初始化代码,以确保在运行任何实际代码之前完成所有注册。我们在应用程序中使用了一个名为 register 的模块,然后使用类似于管理员自动发现的 代码片段 来遍历已安装的应用程序并加载此模块。
构建状态
项目详情
django-appdata-0.4.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | db5726e3118f15b3894e581392dfde355ebce4d66000b15c0cffc3fc80a01446 |
|
MD5 | 3a7536174c11a6e81cb66bc14738530e |
|
BLAKE2b-256 | 06803d7f1ce310c6ad30e2d70b1dc37378950a6f6650d4ebdd11faabe149e712 |
django_appdata-0.4.0-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 3d415c9d2b627184dba8f92ae454345adcdc803514c86a25a87bbf34ea2b3d91 |
|
MD5 | 8c3ed049ea715b10e219ff0feff739a0 |
|
BLAKE2b-256 | 51556aa208a17491cc25a20a3c257f782b92b0807e633e01d2a13429176b631c |