【问题标题】:Django global variable based on user groups基于用户组的Django全局变量
【发布时间】:2018-05-24 09:58:51
【问题描述】:

在我的 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)

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

【问题讨论】:

  • 嘿,当你说下拉菜单时,你是在说你的 Django 管理员吗?
  • 我说的是模板中的 Django 用户而不是 Django 管理员,在我的情况下,用户不需要访问管理员,因为他们只需要浏览和过滤数据,而不是编辑或更新它。
  • 你解决了吗?
  • 好的,谢谢大家,我明天会发布我想出的解决方案。

标签: django


【解决方案1】:

你可以试试这样的:

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/

【讨论】:

  • 是的,两种方式都可以完美运行,但我感兴趣的是如何在 Django 的下拉菜单中获取全局变量。我可能还不清楚,但 Django 文档非常缺乏的是任何不限于一个视图的全局变量。使用 request.User 或 datetime.now() 很容易,但任何特定于用户的内容都很少有文档记录。我想登录的用户是某个地方的变量集,因此我想看看我是否可以创建类似的东西。
【解决方案2】:

你可以扩展 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)

【讨论】:

    【解决方案3】:

    我假设您知道如何获取组列表,并且只是在研究如何将此列表放入模板中。如果没有,请告诉我,我也会解释。

    如果您想将全局变量放入模板中,实际上有 3 个主要选项:

    1. 制作一个以当前用户为输入的自定义模板标签,并生成此列表作为输出。
    2. 使用中间件生成列表,并将其附加到每个请求的当前上下文中
    3. 在你的用户类上使用一个方法,或者混合它(如果你使用一个自定义的用户类真的很容易),然后在你的模板中将该方法作为 user.method 调用。请记住从方法调用中排除括号(仅在模板中),并记住此方法不应接受除 self 以外的任何参数。

    【讨论】:

      【解决方案4】:

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

      #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% 的东西,但它确实有效,而且我的用户很满意。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-30
        • 2017-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-29
        • 1970-01-01
        相关资源
        最近更新 更多