跳转到主要内容

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.Formdjango.forms.ModelForm 的简单子类,则使用多重继承以从 PermissionedFormPermissionedModelForm 继承应该可以工作

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.tar.gz (5.9 kB 查看散列)

上传时间

构建分布

django_permissionedforms-0.1-py2.py3-none-any.whl (5.7 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持