【问题标题】:ValueError in tests permission in djangodjango中测试权限中的ValueError
【发布时间】:2015-02-13 10:05:24
【问题描述】:

我想在我的应用程序中测试权限。我想给我的用户权限,看看他们是否在那里。 我收到此错误:

ValueError: invalid literal for int() with base 10: 'myapp.can_view'

代码

class PermissionsTest(WebTest):
    def setUp(self):
        self.user = G(User, username='user', password='pass')

    def test_user_login_permission(self):
        app = self.app.get(reverse('myapp:dashboard'), user=self.user)
        self.assertEqual(app.status_code, 200)

    def test_user_add_permissions(self):
        self.user.user_permissions.add('myapp.can_view')
        self.user.save()
        self.assertTrue(self.user.has_perm('myapp.can_view'))

【问题讨论】:

    标签: python django unit-testing permissions webtest


    【解决方案1】:

    User.user_permissions 是一个 M2M 字段,因此您不能向该字段添加字符串。改为添加 Permission 实例:

    from django.contrib.auth.models import Permission
    
    permission = Permission.objects.get(codename='can_view')
    self.user.user_permissions.add(permission)
    

    还要注意are cached 的权限,所以你必须在测试中重新加载User 对象。

    更新:如果您的权限代号不是唯一的,那么您必须在@selcuk 的答案中将content_type 添加到get() 调用中。

    更新 2:要创建权限,您有两种选择。

    自动使用permission 属性到您的Model.Meta 类:

    class MyModel(models.Model):
        class Meta:
            permissions = (('can_view', u'Can view my model'), )
    

    手工:

    from django.contrib.contenttypes.models import ContentType
    from django.contrib.auth.models import Permission
    
    ct = ContentType.objects.ContentType.objects.get_for_model(MyModel)
    permission = Permission.objects.create(content_type=ct,
                                           codename='can_view',
                                           name='Can view my model')
    

    【讨论】:

    • 我得到了 DoesNotExist: 权限匹配查询不存在。
    【解决方案2】:

    您应该将permission 对象传递给add 方法,而不是字符串。这应该会有所帮助:

    from django.contrib.auth.models import Permission
    from django.contrib.contenttypes.models import ContentType
    
    content_type = ContentType.objects.get_for_model(MyModel)
    permission = Permission.objects.get(content_type=content_type, codename='can_view')
    request.user.user_permissions.add(permission)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-25
      • 2015-10-30
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多