基于用户组的Django全局变量

时间:2018-05-24 09:58:52

标签: django

在我的Django项目中,我有一个从Django外部填充的数据库,但需要Django功能以用户友好的方式在数据库中显示数据。遗留数据库结构如下:

class SomeModel(models.Model):
#some fields
group_access = models.ForeignKey(AccessGroup,on_delete=models.CASCADE()

class AccessGroup(models.Model):
group_name = models.CharField(max_length=200)

用户拥有一个自定义用户个人资料,其中包含分配给特定用户的群组名称的多种关系:

class CustomUser(models.Model):
#some values
     projects = models.ManyToManyField(AccessGroup)

目前我能够显示用户有权访问的所有组的数据,但我正在寻找的是一种创建下拉菜单的方法,以便用户可以在组之间切换而无需注销或重新输入组在每个观点上。

4 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

AccessGroup.objects.filter(CustomUser__pk=1)

或者

CustomUser.objects.filter(AccessGroup__group_name='GropName')

https://docs.djangoproject.com/en/2.0/topics/db/examples/many_to_many/

答案 1 :(得分:0)

你可以扩展django用户模型,比如

from django.contrib.auth.models import User

class CustomUser(models.Model):
    projects = models.ManyToManyField(AccessGroup)


class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    custom_user = models.ForeignKey(CustomUser, unique=False)

class SomeModel(models.Model):
    #some fields
    group_access = models.ForeignKey(AccessGroup,on_delete=models.CASCADE()

class AccessGroup(models.Model):
    group_name = models.CharField(max_length=200)

然后这样就可以在你的视图中获取数据

def index(request):
    AccessGroup.objects.filter(user__id=persion(request.user).id)

答案 2 :(得分:0)

我假设您知道如何获取组列表,并且只是想知道如何将此列表转换为模板。如果没有,请告诉我,我也会解释一下。

如果您正在尝试将全局变量转换为模板,那么实际上有3个主要选项:

  1. 创建一个自定义模板标记,将当前用户作为输入,并将此列表生成为输出。
  2. 使用中间件生成列表,并将其附加到每个请求的当前上下文
  3. 在您的用户类或其中混合使用方法(如果您使用自定义用户类,则非常简单),并在模板中将该方法称为user.method。请记住从方法调用中排除括号(仅在模板中),并记住此方法不应接受除self之外的任何参数。

答案 3 :(得分:0)

谢谢大家让我走上正轨。我最终做的是编写一个上下文处理器来检查用户权限:

#context_processors.py
def check_groups(request):
    group_check = AccessGroup.objects.values('id','group_name').filter(projects=request.user.id)
    return {
        'group_check': group_check, 
        }

之后我在base.html中创建了一个Bootstrap-select下拉列表

                    <select class="selecpicker">
                        <optgroup>
                        <option data-hidden="true">Choose group</option>
                        {% for grpup in group_check %}
                            <option val="group.id">{{ group.group_name }}</option>
                        {% endfor %}
</optgroup>

这只是用户使用它作为在视图中切换访问组并通过ajax将值传递给我遇到的任何其他模板视图的手段的问题。 不是100%我想要的,但它的工作原理和用户都很满意。