Как создать пользователя-администратора в djangotests.py

Я пытаюсь создать пользователя-администратора как часть моего test.py для проверки разрешений.

ОБНОВЛЕНИЕ: Tests.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

Ответ, по-видимому, заключается в том, что вы не можете создать пользователя-администратора в setUp, но можете в любой другой функции, поэтому, если вы хотите, чтобы пользователь-администратор тестировался, используйте приспособление!


person PhoebeB    schedule 16.08.2010    source источник
comment
@phoebebright: можешь опубликовать код модели? В частности, UserProfile и его связь с User.   -  person Manoj Govindan    schedule 16.08.2010
comment
@phoebebright: А у вас есть какие-нибудь приспособления?   -  person Sam Dolan    schedule 16.08.2010
comment
@phoebebright: Кстати, ваша ссылка UserProfile -> User должна быть OneToOneField. См. b-list.org/ weblog/2006/jun/06/django-tips-extending-user-model   -  person Sam Dolan    schedule 16.08.2010
comment
@phoebebright: вы вызываете этот фрагмент кода внутри метода test_? Или setUp? Или где-то еще?   -  person Manoj Govindan    schedule 16.08.2010
comment
@phoebebright: Я второй комментарий Маноджа ... Как насчет того, чтобы просто опубликовать класс тестового примера целиком?   -  person Sam Dolan    schedule 16.08.2010
comment
ПРОГРЕСС = если я перенесу команду для создания пользователя из setUp в один из тестовых наборов, она работает нормально!!! Я так понимаю, нельзя создать пользователя-администратора в setup?   -  person PhoebeB    schedule 17.08.2010
comment
@sdolan исправит пользовательский профиль = спасибо за совет   -  person PhoebeB    schedule 17.08.2010


Ответы (2)


Обновление 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/базы данных вы используете?

Также User не имеет атрибута name. Можете ли вы еще раз проверить, используете ли вы auth.User?

Должен ли я загружать пользователей-администраторов в качестве приборов?

Вы не должны. Но если вы создаете этого пользователя-администратора исключительно для целей тестирования, было бы неплохо добавить Fixture. Именно это я делаю в своих проектах.

person Manoj Govindan    schedule 16.08.2010
comment
Пробовал в оболочке, работает нормально. У меня есть прикрепленный профиль пользователя (в котором нет имени), и я могу добавлять профили пользователей для других типов пользователей, но не для суперпользователя или персонала. Сбит с толку! - person PhoebeB; 16.08.2010
comment
@phoebebright: Ваша ошибка говорит, в какой таблице она происходит ... это таблица auth_user? - person Sam Dolan; 16.08.2010
comment
разместил немного больше информации выше. - person PhoebeB; 16.08.2010

Я бы использовал встроенный 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
person Sam Dolan    schedule 16.08.2010
comment
по-прежнему получаю ту же ошибку, когда я меняю create_user на create_superuser, даже не пытаясь выполнить клиентский бит... - person PhoebeB; 16.08.2010
comment
Удалите c = Client() и замените c.login на self.client.login при выполнении из теста, наследуемого от TestCase - person Shadi; 31.10.2017