我想在我的应用程序中测试权限。我想给我的用户权限,看看他们是否在那里。 我收到这个错误:
ValueError: invalid literal for int() with base 10: 'myapp.can_view'
CODE
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'))
答案 0 :(得分:3)
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')
答案 1 :(得分:1)
您应该将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)