2010-08-16 12 views
22

Estoy tratando de crear un usuario administrador como parte de mi tests.py para verificar los permisos.Cómo crear un usuario administrador en django tests.py

ACTUALIZACIÓN: Test.py es el formato estándar que las subclases de TestCase y el código siguiente se llaman en la función setUp().

Puedo crear un usuario normal pero no un usuario administrador. Si intento esto:

self.adminuser = User.objects.create_user('admin', '[email protected]', 'pass') 
    self.adminuser.save() 
    self.adminuser.is_staff = True 
    self.adminuser.save() 

O self.adminuser = User.objects.create_superuser ('admin', '[email protected]', 'pase') self.adminuser.save()

me sale:

Warning: Data truncated for column 'name' at row 1 

Si quito la línea is_staff todo está bien (excepto que no puedo hacer mi prueba!)

¿tengo que cargar los usuarios administradores como accesorios?

PerfilUsuario se define como sigue:

class UserProfile(models.Model): 

    user = models.ForeignKey(User, unique=True) 
    organisation = models.ForeignKey(Organisation, null=True, blank=True) 
    telephone = models.CharField(max_length=20, null=True, blank=True) 

y lleno de rastreo de error es:

Traceback (most recent call last): 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 242, in __call__ 
     self._pre_setup() 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 217, in _pre_setup 
     self._fixture_setup() 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 440, in _fixture_setup 
     return super(TestCase, self)._fixture_setup() 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 222, in _fixture_setup 
     call_command('flush', verbosity=0, interactive=False) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/__init__.py", line 166, in call_command 
     return klass.execute(*args, **defaults) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 222, in execute 
     output = self.handle(*args, **options) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 351, in handle 
     return self.handle_noargs(**options) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/commands/flush.py", line 61, in handle_noargs 
     emit_post_sync_signal(models.get_models(), verbosity, interactive) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/sql.py", line 205, in emit_post_sync_signal 
     interactive=interactive) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/dispatch/dispatcher.py", line 166, in send 
     response = receiver(signal=self, sender=sender, **named) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions 
     defaults={'name': name, 'content_type': ctype}) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 123, in get_or_create 
     return self.get_query_set().get_or_create(**kwargs) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 335, in get_or_create 
     obj.save(force_insert=True) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 410, in save 
     self.save_base(force_insert=force_insert, force_update=force_update) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 495, in save_base 
     result = manager._insert(values, return_id=update_pk) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 177, in _insert 
     return insert_query(self.model, values, **kwargs) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 1087, in insert_query 
     return query.execute_sql(return_id) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/subqueries.py", line 320, in execute_sql 
     cursor = super(InsertQuery, self).execute_sql(None) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/query.py", line 2369, in execute_sql 
     cursor.execute(sql, params) 
     File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/backends/mysql/base.py", line 84, in execute 
     return self.cursor.execute(query, args) 
     File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 175, in execute 
     File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 89, in _warning_check 
     File "/usr/lib64/python2.4/warnings.py", line 61, in warn 
     warn_explicit(message, category, filename, lineno, module, registry) 
     File "/usr/lib64/python2.4/warnings.py", line 96, in warn_explicit 
     raise message 
    Warning: Data truncated for column 'name' at row 1 

La respuesta parece ser que no se puede crear un usuario administrador de configuración, pero se puede en cualquier otra función así que si quieres un usuario administrador en las pruebas, utiliza un accesorio!

+1

@phoebebright: ¿puedes publicar el código del modelo? Específicamente, 'UserProfile' y su relación con' User'. –

+0

@phoebebright: ¿Y tienes alguna instalación de accesorios? – sdolan

+0

@phoebebright: En una nota lateral, su referencia 'UserProfile' ->' User' debe ser 'OneToOneField'. Consulte http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/ – sdolan

Respuesta

4

Actualización 2

ejecuta el fragmento para crear el superusuario desde dentro de un caso de prueba (subclase de django.test.TestCase). Todo salió bien. También creó y guardó una instancia de UserProfile con user = self.adminuser. Eso también funcionó.

actualización

Esta línea es interesante:

File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions 
     defaults={'name': name, 'content_type': ctype}) 

Parece que la ejecución falla al crear permisos.

respuesta original

Advertencia: Datos truncados para la columna 'nombre' en la fila 1

extraño. Intenté esto desde el caparazón de Django y funcionó para mí. Estoy usando Postgresql 8.3 y Django 1.2.1 en Ubuntu Jaunty. ¿Puede dar más detalles sobre qué versión de Django/base de datos está utilizando?

También User no tiene un atributo name. ¿Puedes verificar si estás usando auth.User?

¿Tengo que cargar usuarios de administrador como elementos fijos?

Usted no tiene. Pero si está creando este usuario administrador únicamente para fines de prueba, sería una buena idea agregar un dispositivo. Eso es lo que hago en mis proyectos.

+0

Intentó en shell y funciona bien. Tengo el perfil de usuario adjunto (que no tiene nombre) y puedo agregar perfiles de usuario de manera adecuada para otros tipos de usuarios, simplemente no soy superusuario ni personal. ¡Desconcertado! – PhoebeB

+0

@phoebebright: ¿Su error indica qué tabla está ocurriendo en ... es la tabla auth_user? – sdolan

+0

publicado un poco más de información arriba. – PhoebeB

47

Utilizaría el create_superuser incorporado y registraré al usuario antes de realizar cualquier solicitud. Lo siguiente debería funcionar:

from django.contrib.auth.models import User 
from django.test.client import Client 

# store the password to login later 
password = 'mypassword' 

my_admin = User.objects.create_superuser('myuser', '[email protected]', password) 

c = Client() 

# You'll need to log him in before you can send requests through the client 
c.login(username=my_admin.username, password=password) 

# tests go here 
+0

aún recibo el mismo error cuando cambio create_user para create_superuser, sin siquiera intentar hacer el bit de cliente ... – PhoebeB

+1

¡Esta debería ser la respuesta aceptada! –

+1

Suelta 'c = Client()' y reemplaza 'c.login' con' self.client.login' cuando se ejecuta desde una prueba que hereda de 'TestCase' – shadi

Cuestiones relacionadas