如何通过Django Rest框架公开djangconstance设置?

2024-04-28 07:16:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在建立一个项目,我需要有一些自定义设置,可编辑的某些用户没有访问django管理面板,谁访问的应用程序通过一个角度前端。在

我安装django constance是为了让这些自定义设置可编辑,因为它是我在Django packages site上找到的最推荐的包。我现在的问题是,我不知道如何为我的API rest提供设置服务。在

我从一些自定义视图开始:

class ConstanceSettingSerializer(serializers.Serializer):

name = serializers.CharField()
value = serializers.Field()
defult_value = serializers.Field()
modified = serializers.BooleanField(read_only=True)


from constance import settings as constance_settings

class ConstanceView(APIView):

def get(self, request):

    settings = constance_settings.CONFIG.items()

    return Response(settings, status=status.HTTP_200_OK)

但现在我不知道如何将这些设置正确地传递给我的序列化程序。我试了一下但没有成功:

^{pr2}$

我只会犯错误。在

你知道怎么做吗?在

谢谢!在


Tags: 项目django用户constance应用程序面板编辑field
2条回答

序列化程序需要知道返回什么。对于每个字段,您可以这样做:

class ConstanceSettingSerializer(serializers.Serializer):

    setting_name = serializers.SerializerMethodField()

    def get_setting_name(self):
        settings = constance_settings.CONFIG.items()
        # Retrieve your setting's value here and return
        return setting_value

那就要走了。如果希望能够通过PUT/POST/PATCH更改设置,则需要重写序列化程序中的create/update,并实现逻辑来自己保存值。在

另一种方法是检查设置的存储是如何实现的。 我没有使用constance设置,所以我不能说。但如果它使用DB来存储设置,则可以为它们所使用的模型实现模型序列化器。在

给你演示一下

from .utils import get_settings
from constance import config
from rest_framework.viewsets import ViewSet

class SettingViewSet(ViewSet):
    permission_classes = (IsAuthenticated,)

    def setting(self, request, allow_settings):
        if request.method == 'GET':
            # list all setting items
            return Response(data=get_settings(allow_settings))
        else:
            # change all allow setting items in allow_settings
            for key in request.data:
                if key in allow_settings and key in getattr(settings, 'CONSTANCE_CONFIG', {}):
                    value = request.data[key]
                    setattr(config, key, '' if value is None else value)
            return Response(data=get_settings(allow_settings))

    def create(self, request):
        """
        <p>update with POST:<code>{'Key': new_value}</code>
        """
        allow_settings = [key for key, options in getattr(settings, 'CONSTANCE_CONFIG', {}).items()]
        return self.setting(request, allow_settings)

    def list(self, request):
        """
        get all setting item
        """
        allow_settings = [key for key, options in getattr(settings, 'CONSTANCE_CONFIG', {}).items()]
        return self.setting(request, allow_settings)

在实用工具.py公司名称:

^{pr2}$

在网址.py公司名称:

router.register(r'setting', SettingViewSet, base_name='setting')

ask gethttp://x.x.x.x/setting/你可以得到:

[
    {
        "key": "staff_prefix",
        "default": "",
        "help_text": "工号固定代码",
        "value": ""
    },
    {
        "key": "staff_suffix",
        "default": 3,
        "help_text": "工号尾缀",
        "value": "3"
    }
]

使用数据http://x.x.x.x/setting/后,{'staff_prefix': 'demo'}可以更新staff_prefix中的值。在

相关问题 更多 >