代码之家  ›  专栏  ›  技术社区  ›  PhoebeB

如何在django tests.py中创建管理用户

  •  26
  • PhoebeB  · 技术社区  · 15 年前

    我正在尝试创建一个管理员用户作为tests.py的一部分来检查permissions。

    更新: tests.py是testcase子类的标准格式,下面的代码在setup()函数中调用。

    我可以创建普通用户,但不能创建管理用户。如果我尝试这个:

        self.adminuser = User.objects.create_user('admin', 'admin@test.com', 'pass')
        self.adminuser.save()
        self.adminuser.is_staff = True
        self.adminuser.save()
    

    或 self.admin user=user.objects.create_superuser('admin'、'admin@test.com'、'pass') self.adminuser.save()。

    我得到:

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

    如果我去掉了IS U员工线,一切都很好(除了我不能做我的测试!)

    我是否必须将管理员用户加载为设备?

    用户配置文件定义如下:

    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
    

    答案 似乎您不能在安装程序中创建管理员用户,但您可以在任何其他功能中创建,所以如果您希望在测试中使用管理员用户,请使用fixture!

    2 回复  |  直到 15 年前
        1
  •  4
  •   Manoj Govindan    15 年前

    更新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行列“name”的数据被截断

    奇怪。我从姜戈壳里试过这个,它对我有用。我在UbuntuJaunty上使用PostgreSQL 8.3和Django1.2.1。您能提供更多关于您使用的django/database版本的详细信息吗?

    阿尔索 User 没有一个 name 属性。你能再检查一下你是否在使用 auth.User ?

    我是否必须将管理员用户加载为设备?

    你不 不得不 . 但是,如果您只是为了测试目的而创建这个管理用户,那么添加一个fixture是一个好主意。这就是我在项目中所做的。

        2
  •  50
  •   Sam Dolan    15 年前

    我会使用内置的 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', 'myemail@test.com', 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