2010-08-16 13 views
22

Próbuję utworzyć użytkownika admin jako część mojego tests.py, aby sprawdzić persmissions.Jak utworzyć użytkownika admin w django tests.py

UPDATE: Tests.py jest standardowym formatem, który podklasuje TestCase, a kod poniżej jest wywoływany w funkcji setUp().

Mogę utworzyć zwykłego użytkownika, ale nie administratora. Gdy próbuję to:

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

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

uzyskać:

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

Jeśli usunąć linię is_staff wszystko jest dobrze (z wyjątkiem nie mogę zrobić mój test!)

Czy muszę załadować administratora użytkowników jako opraw?

UserProfile jest zdefiniowany następująco:

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) 

i pełne błędów traceback jest:

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 

Odpowiedź wydaje się, że nie można utworzyć użytkownika administracyjnego w Konfiguracji ale może w dowolnej innej funkcji, więc jeśli chcesz, aby administrator testował, użyj urządzenia!

+1

@phoebebright: czy możesz opublikować kod modelu? W szczególności 'UserProfile' i jego relacja do' User'. –

+0

@phoebebright: Czy masz jakieś ustawienia urządzeń? – sdolan

+0

@phoebebright: Na marginesie, twój 'UserProfile' ->' User' reference powinien być 'OneToOneField'. Zobacz http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/ – sdolan

Odpowiedz

4

Aktualizacja 2

Wykonano fragment do tworzenia administratora, ze w przypadku testu (podklasy django.test.TestCase). Wszystko poszło dobrze. Utworzono także i zapisano wystąpienie UserProfile z user = self.adminuser. To też zadziałało.

Aktualizacja

Linia ta jest interesująca:

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

Wygląda wykonanie nie powiedzie się podczas tworzenia uprawnienia.

oryginalny odpowiedzi

Uwaga: Dane obcinane na kolumnie 'nazwy' w rzędzie 1

dziwne. Próbowałem tego z powłoki Django i zadziałało to dla mnie. Używam PostgreSQL 8.3 i Django 1.2.1 na Ubuntu Jaunty. Czy możesz podać więcej szczegółów na temat używanej wersji Django/bazy danych?

Również nie ma atrybutu name. Czy możesz dwukrotnie sprawdzić, czy używasz auth.User?

Czy muszę załadować użytkowników adminów jako urządzenia?

Nie musisz mieć do. Ale jeśli tworzysz tego administratora tylko do celów testowych, dobrym pomysłem byłoby dodanie Urządzenia. Tak robię w moich projektach.

+0

Próbowałem w powłoce i działa dobrze. Mam dołączony profil użytkownika (który nie ma w nim nazwy) i mogę dodawać profile użytkownika grzywny dla innych typów użytkowników, po prostu nie superużytkownika ani pracowników. Baffled! – PhoebeB

+0

@phoebebright: Czy Twój błąd określa tabelę, w której występuje ... czy jest to tabela auth_user? – sdolan

+0

opublikował nieco więcej informacji powyżej. – PhoebeB

47

Użyłbym wbudowanego create_superuser i zalogowania użytkownika przed wykonaniem jakichkolwiek żądań. Powinno działać:

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

nadal otrzymuję ten sam błąd, gdy zmienię create_user na create_superuser, nawet nie próbując wykonać bit klienta ... – PhoebeB

+1

To powinna być zaakceptowana odpowiedź! –

+1

Upuść 'c = Client()' i zamień 'c.login' na' self.client.login' po wykonaniu z testu dziedziczącego z 'TestCase' – shadi