Django 测试权限中的 ValueError

ValueError in tests permission in django

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

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'))

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 对象。

UPDATE:如果您许可的代号不是唯一的,那么您必须像@selcuk 那样在 get() 调用中添加一个 content_type回答。

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

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

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')

您应该将 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)