Django扩展,用于创建根据用户权限变化的表单
项目描述
django-permissionedforms
django-permissionedforms
是Django表单框架的扩展,允许您定义表单,其中某些字段根据用户的权限显示或省略。
安装
运行:pip install django-permissionedforms
用法
要将权限规则添加到基本Django表单,用permissionedforms.PermissionedForm
代替django.forms.Form
,并添加一个内部Meta
类。
from permissionedforms import PermissionedForm
class PersonForm(PermissionedForm):
first_name = forms.CharField()
last_name = forms.CharField()
class Meta:
field_permissions = {
'last_name': 'myapp.change_last_name'
}
field_permissions
是一个字典,将字段名称映射到权限名称。对于每个列出的字段,只有当用户具有指定的权限时(由 user.has_perm()
方法定义),该字段才会包含在最终表单中。有关如何设置权限的详细信息,请参阅 Django 的文档:自定义权限 和 以编程方式创建权限;或者,如果您想将字段仅设置为超级用户可用,可以使用任意字符串(如 'superuser'
)作为名称,因为 has_perm
对于他们始终返回 True。
然后,在实例化表单时,传递关键字参数 for_user
form = PersonForm(for_user=request.user)
这将导致一个表单,其中 last_name
字段仅在登录用户具有 change_last_name
权限时存在。
for_user
关键字参数是可选的,如果不传递,表单将像普通表单一样行为,所有命名字段都可用。
对于 ModelForm,过程相同,只是您应该继承自 permissionedforms.PermissionedModelForm
而不是。在现有的 Meta
选项旁边添加 field_permissions
from permissionedforms import PermissionedModelForm
class CountryForm(PermissionedModelForm):
class Meta:
model = Country
fields = ['name', 'description']
field_permissions = {
'description': 'tests.change_country_description'
}
form = CountryForm(instance=country, for_user=request.user)
与其他基表单类集成
您可能希望将来自 django-permissionedforms
的权限处理集成到其他基表单类中,例如来自 django-modelcluster 包的 ClusterForm
。如果该基表单类是 django.forms.Form
或 django.forms.ModelForm
的简单子类,则使用多重继承以从 PermissionedForm
或 PermissionedModelForm
继承应该可以工作
from fancyforms import FancyForm # made up for example purposes
from permissionedforms import PermissionedForm
class FancyPermissionedForm(PermissionedForm, FancyForm):
pass
但是,如果基表单类实现了自己的元类,则会失败。在这种情况下,您需要定义一个新的元类,它从现有的一个继承并继承自 permissionedforms.PermissionedFormMetaclass
from fancyforms import FancyForm
from permissionedforms import PermissionedForm, PermissionedFormMetaclass
FancyFormMetaclass = type(FancyForm)
class FancyPermissionedFormMetaclass(PermissionedFormMetaclass, FancyFormMetaclass):
pass
class FancyPermissionedForm(PermissionedForm, FancyForm, metaclass=FancyPermissionedFormMetaclass):
pass
如果基表单类包含一个自定义选项类,以允许它接受自己的 class Meta
选项,则可能还会失败。如果是这样,则需要定义一个新的选项类,再次使用多重继承来从现有的选项类和 permissionedforms.PermissionedFormOptionsMixin
继承,然后将此设置为元类的 options_class
。以下配方适用于 ClusterForm
from modelcluster.forms import ClusterForm, ClusterFormMetaclass, ClusterFormOptions
from permissionedforms import PermissionedForm, PermissionedFormMetaclass, PermissionedFormOptionsMixin
class PermissionedClusterFormOptions(PermissionedFormOptionsMixin, ClusterFormOptions):
pass
class PermissionedClusterFormMetaclass(PermissionedFormMetaclass, ClusterFormMetaclass):
options_class = PermissionedClusterFormOptions
class PermissionedClusterForm(PermissionedForm, ClusterForm, metaclass=PermissionedClusterFormMetaclass):
pass
致谢
django-permissionedforms
是作为 Wagtail 的下一代页面编辑器的一部分开发的,由 Google 赞助。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。
源分布
构建分布
哈希值 用于 django_permissionedforms-0.1-py2.py3-none-any.whl
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d341a961a27cc77fde8cc42141c6ab55cc1f0cb886963cc2d6967b9674fa47d6 |
|
MD5 | a64ad0256c4d87addb39bc9751de57b4 |
|
BLAKE2b-256 | e65b216157ff053f955b15b9dcdc13bfb6e406666445164fee9e332e141be96d |