【问题标题】:Model and Permissions模型和权限
【发布时间】:2026-02-02 17:50:01
【问题描述】:

我目前正在学习 python/django 作为我自己的教程,我已经这样做了:

  • 创建用户 --> 好的
  • 已创建登录用户 --> 好的
  • 创建一个名为“Article”的新模型,将标题和内容作为属性 --> ok
  • 创建几个“文章”实例 --> 好的
  • 我在webapp的根目录显示所有文章-->
  • 最后一步是:为了操作权限,只显​​示一些文章,具体取决于哪个用户登录了权限。就像用户 A:那么只显示具有奇数 id 的文章(这没有任何意义,但它是为了学习)

手动做'permission by instance'似乎很复杂吧?

干杯

【问题讨论】:

  • 没那么复杂,您只需要检查当前登录用户是否具有访问该特定视图的权限即可。 user.has_perm('myapp.can_view_odd_ids')。对于你自己的教程,我会分享给你reference,没有答案,你可以自己尝试。不要忘记创建权限实例,(可以使用 shell 或作为数据迁移)......如果你想看看我是怎么做的,请告诉我(当然在你尝试之后),然后我将它创建为一个新的回答。 祝您的教程一切顺利。祝你好运:)
  • 太棒了!我会努力的,让你知道 :) 干杯
  • 嗨,我计划执行以下步骤: * 创建 2 个权限 can_view_odd_ids 和 can_view_even_ids * 将新权限保存在数据库中(我必须创建新模型吗?) * 创建新属性 'permission ' 在用户上 * 在用户实例上随机设置权限 * 在视图中检查用户是否具有 user.has(myapp.can_view_odd_ids) 的权限并给他一个好的列表。你怎么看?这有意义吗?
  • 如果您使用django.controb.auth,则无需创建新模型,只需使用auth.Permission 作为模型即可。无需为User 添加属性,默认的auth.User 已经有来自PermissionMixininherit。您可以根据自己的需要分配不同用户的权限,(随机听起来很奇怪,但没关系,..)
  • 好的,太好了!随机大声笑我的意思是我只需要其中两个用户并且每个用户都有不同的权限!谢谢!

标签: django django-models


【解决方案1】:

当你说 '我需要实例许可' 时,可能你的意思是 '我需要使用 django-guardian' https://django-guardian.readthedocs.org/en/stable/

【讨论】:

    【解决方案2】:

    首先我们必须创建我们的 2 个权限

    from django.db import models
    
    class Article(models.Model):
        title = models.TextField()
        content = models.TextField()
    
        class Meta:
            permissions = (
                ('can_view_odd_ids', 'can_view_odd_ids'),
                ('can_view_even_ids', 'can_view_even_ids'),
            )
    
        def __str__(self):
            return self.title
    

    运行迁移后,我们可以使用 shell 手动将权限应用到我们的用户

    odd_even = Permission.objects.get(name='can_view_even_ids')
    user_yui = User.objects.get(username='yui')
    user_yui.user_permissions.add(odd_even)
    user_yui.save()
    

    然后在视图中测试我们用户的权限(类似这样)

    def my_view(request):
        data = {}
        if request.user.is_authenticated():
            count = Article.objects.all().count()
            if request.user.has_perm("account.can_view_odd_ids"):
                data = {'articles': Article.objects.all()[1::2]})
            elif request.user.has_perm("account.can_view_even_ids"):
                data = {'articles': Article.objects.all()[0::2]})
        return render(request, 'index.html', data)
    

    【讨论】:

    • 给出更有意义的详细信息,例如('can_view_odd_ids', 'Can View odd ID'),
    • 请注意我对您的回答所做的更改或重构。
    • 还要查询奇数或偶数的文章,你可以使用下面的:Article.objects.all()[1::2] 不加计数,或者你也可以试试this one :p 尤其是使用正则表达式。
    • 谢谢大家!我想我会保留 [1::2] 语法,因为它更短:)
    • can_view_odd_ids 与 'Can 查看奇数 ID 的区别是什么????????????????/