Как создать пользователя admin в django tests.py
Я пытаюсь создать пользователя admin как часть моего test.py, чтобы проверить на persmissions.
UPDATE:
Test.py - это стандартный формат, который подклассы TestCase и код ниже вызывается в функции setUp().
Я могу создать обычного пользователя, но не администратора. Если я попробую это:
self.adminuser = User.objects.create_user('admin', '[email protected]', 'pass')
self.adminuser.save()
self.adminuser.is_staff = True
self.adminuser.save()
ИЛИ self.adminuser = User.objects.create_superuser ('admin', '[email protected]', 'pass') self.adminuser.save()
Я получаю:
Warning: Data truncated for column 'name' at row 1
Если удалить строку is_staff, все будет хорошо (кроме того, что я не могу выполнить свой тест!)
Нужно ли загружать администраторов в качестве светильников?
UserProfile определяется следующим образом:
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)
и полная ошибка отслеживания:
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
Ответ заключается в том, что вы не можете создать пользователя admin в setUp, но вы можете использовать любую другую функцию, поэтому, если вы хотите, чтобы пользователь-админ тестировал, используйте прибор!
Ответы
Ответ 1
Обновление 2
Выполнен фрагмент для создания суперпользователя из тестового примера (подкласс django.test.TestCase
). Все прошло хорошо. Также создан и сохранен экземпляр UserProfile
с user = self.adminuser
. Это тоже сработало.
Обновление
Эта строка интересна:
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})
Похоже, выполнение выполняется при создании разрешений.
Оригинальный ответ
Предупреждение: данные усекаются для имени столбца в строке 1
Странно. Я попробовал это из оболочки Django, и это сработало для меня. Я использую Postgresql 8.3 и Django 1.2.1 на Ubuntu Jaunty. Можете ли вы дать более подробную информацию о том, какую версию Django/database вы используете?
Также User
не имеет атрибута name
. Можете ли вы дважды проверить, используете ли вы auth.User
?
Нужно ли загружать администраторов в качестве светильников?
Вам не обязательно. Но если вы создаете этого пользователя admin исключительно для тестирования, тогда было бы неплохо добавить Fixture. Это то, что я делаю в своих проектах.
Ответ 2
Я бы использовал встроенный create_superuser
и запустил пользователя, прежде чем делать какие-либо запросы. Должно работать следующее:
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