从模型列表创建constance django

hec6srdp  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(109)

我需要实现的功能时,只有一个用户的用户模型可以有'编辑器角色',我将使用这个常数在我的drf API。所以我需要创建一个django常量,只有一个用户id,并在django管理面板中创建所有用户的下拉菜单。我该怎么做?还有其他想法如何实现此功能吗?我选择了django-constant,但面临着模型数据列表无法在设置py中初始化的问题:

CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend'

CONSTANCE_ADDITIONAL_FIELDS = {
    'users_select': ['django.forms.fields.ChoiceField', {
        'widget': 'django.forms.Select',
        'choices': (
            (None, "-----"),
            User.objects.all().split(","))
        )
    }],
}

CONSTANCE_CONFIG = {
    'DEFAULT_USER': ('', 'default user', 'users_select'),
}

UPD我决定使用json文件的列表,但仍然不确定它的最佳结果。也许我会找到更好的设计

def users_list():
    f = open('apps/users/data.json')
    data = json.load(f)
    result = ((user['id'], user['full_name']) for user in data)
    f.close()
    return tuple(result)

CONSTANCE_ADDITIONAL_FIELDS = {
    'user_select': ['django.forms.fields.ChoiceField', {
        'widget': 'django.forms.Select',
        'choices': (
            (None, "-----"),
        ) + users_list()
    }],
}
ny6fqffe

ny6fqffe1#

如果你想实现只有一个用户可以拥有“编辑角色”的功能,你可以不使用像django-constance这样的Django包来实现。相反,您可以使用Django的内置模型和管理面板来管理用户角色和限制。以下是你可以如何处理它:
1.将BooleanField添加到User模型:在User模型中,添加BooleanField以指示用户是否具有'editor-role'。例如:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    is_editor = models.BooleanField(default=False)

1.将编辑器角色限制为仅一个用户:要确保只有一个用户拥有'editor-role',可以重写User模型的save()方法来强制执行此限制。下面是一个例子:

class User(AbstractUser):
    is_editor = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        if self.is_editor:
            User.objects.filter(is_editor=True).update(is_editor=False)
        super().save(*args, **kwargs)

在此代码中,当使用is_editor=True保存用户时,它首先将所有使用is_editor=True的用户更新为is_editor=False。这确保在任何给定时间只有一个用户可以拥有'editor-role'
1.使用Django管理面板管理用户角色:通过以上设置,您可以使用Django管理面板为用户管理'editor-role'。您可以为User模型创建一个自定义管理表单,以显示一个下拉菜单,用于选择'editor-role'用户。下面是一个例子:

from django import forms
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

class UserChangeForm(forms.ModelForm):
    class Meta:
        model = User
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['is_editor'].widget = forms.Select(choices=self._get_editor_choices())

    def _get_editor_choices(self):
        choices = [(False, 'No'), (True, 'Yes')]
        return choices

class CustomUserAdmin(UserAdmin):
    form = UserChangeForm

admin.site.register(User, CustomUserAdmin)

在这段代码中,我们创建了一个自定义表单UserChangeForm,它用下拉菜单替换了is_editor字段的默认小部件。下拉菜单提供'Yes''No'选项,以选择'editor-role'用户。
通过这些修改,您可以在Django管理面板中为用户管理'editor-role',而不需要像django-constance这样的额外包。

相关问题