2010-08-16 12 views
22

Sto provando a creare un utente amministratore come parte del mio tests.py per controllare le persecuzioni.Come creare un utente amministratore in django tests.py

UPDATE: Il tests.py è il formato standard che sottoclasse TestCase e il codice riportato sotto è chiamato nella funzione setUp().

Posso creare un utente normale ma non un utente amministratore. Se provo questo:

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

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

ottengo:

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

Se rimuovo la linea is_staff tutto va bene (tranne che non posso fare la mia prova!)

devo caricare utenti admin come infissi?

ProfiloUtente è definito come segue:

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) 

e piena di errore traceback è:

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 risposta sembra essere che non è possibile creare un utente amministratore nel programma di installazione, ma si può in qualsiasi altra funzione, quindi se vuoi che un utente amministratore collauda, ​​usa una fixture!

+1

@phoebebright: puoi pubblicare il codice del modello? In particolare, 'UserProfile' e la sua relazione con' Utente'. –

+0

@phoebebright: E hai qualche installazione? – sdolan

+0

@phoebebright: In una nota a margine, il riferimento 'UserProfile' ->' User' dovrebbe essere un 'OneToOneField'. Vedi http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/ – sdolan

risposta

4

Aggiornamento 2

eseguito il frammento per creare il super-utente all'interno di un banco di prova (sottoclasse di django.test.TestCase). È andato tutto bene Inoltre, ha creato e salvato un'istanza di UserProfile con user = self.adminuser. Anche quello ha funzionato.

Aggiornamento

Questa linea è interessante:

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

Sembra esecuzione fallisce durante la creazione delle autorizzazioni.

risposta originale

Attenzione: I dati troncati per la colonna 'nome' in fila 1

Strano. Ho provato questo dal guscio Django e ha funzionato per me. Sto usando Postgresql 8.3 e Django 1.2.1 su Ubuntu Jaunty. Puoi fornire maggiori dettagli su quale versione di Django/database stai usando?

Anche User non ha un attributo name. Puoi ricontrollare se stai usando auth.User?

Devo caricare gli utenti admin come fixture?

Non necessario. Ma se stai creando questo utente admin solo a scopo di test, sarebbe una buona idea aggiungere un dispositivo. Questo è quello che faccio nei miei progetti.

+0

Provato in shell e funziona bene. Ho un profilo utente allegato (che non ha nome in esso) e posso aggiungere userprofiles bene per altri tipi di utente, solo non superuser o staff. Sconcertato! – PhoebeB

+0

@phoebebright: Il tuo errore dice che tabella si sta verificando in ... è la tabella auth_user? – sdolan

+0

pubblicato un po 'più informazioni sopra. – PhoebeB

47

Vorrei utilizzare lo create_superuser integrato e registrare l'utente prima di effettuare qualsiasi richiesta. Il seguente dovrebbe funzionare:

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

continuano a ricevere lo stesso errore quando cambio create_user in create_superuser, senza nemmeno provare a fare il bit del client ... – PhoebeB

+1

Questa dovrebbe essere la risposta accettata! –

+1

Drop 'c = Client()' e sostituisce 'c.login' con' self.client.login' se eseguito da un test ereditato da 'TestCase' – shadi

Problemi correlati