如何在django tests.py中创建管理员用户 [英] How to create admin user in django tests.py

查看:117
本文介绍了如何在django tests.py中创建管理员用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



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

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

OR
self.adminuser = User.objects.create_superuser('admin','admin@test.com','pass')
self.adminuser.save()



我得到:

 警告:在第1行的列名称的数据被截断

如果我删除is_staff行全部是好的(除了我不能做我的测试!)



我要加载管理员用户作为固定装置吗?



UserProfile定义如下:

  class UserProfile(models.Model):

user = models.ForeignKey(User,unique = True)
organization = models.ForeignKey(Organization,null = True,blank = True)
phone = models.CharField(max_length = 20,null = true,blank = True)

全错误追溯是:

 追溯(最近的最后一次呼叫):
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2。 4.egg / django / test / testcases.py,第242行,__call__
self._pre_setup()
文件/usr/lib/python2.4/site-packages/Django-1.1。 1-py2.4.egg / django / test / testcases.py,第217行,_pre_setup
self._fixture_setup()
文件/usr/lib/python2.4/site-packages/ Django-1.1.1-py2.4.egg / django / test / testcases.py,第440行,_fixture_setup
返回超级(TestCase,self)._ fixture_setup()
文件/ usr / lib / python2.4 / site-packages / Django-1.1.1-py2.4.egg / django / test / testcases.py,第222行在_fixture_setup
call_command('flush',verbosity = 0, interactive = False)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/__init__.py,第166行, call_command
返回klass.execute(* args,** defaults)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base。 py,行222,执行
output = self.handle(* args,** options)
文件/usr/lib/python2.4/site-packages/Django-1.1.1- py2.4.egg / django / core / management / base.py,第351行,处理
return self.handle_noargs(** options)
文件/usr/lib/python2.4/ site-packages / Django-1.1.1-py2.4.egg / django / core / management / commands / flush.py,第61行,handle_noargs
emit_post_sync_signal(models.get_models(),verbosity,interactive)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/sql.py,第205行,emit_post_sync_signal
interactive = interactive)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/dispatch/dispatcher.py,第166行,发送
response = receiver(signal = self,sender = sender,** named)
文件/ usr / lib / python2.4 / site-packages / Django-1.1.1-py2.4.egg / django / contrib / auth / management / __ init__.py,第28行,create_permissions
defaults = {'名称':name,'content_type':ctype})
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager .py,第123行,get_or_create
return self.get_query_set()。get_or_create(** kwargs)
文件/usr/lib/python2.4/site-packages/Django-1.1.1 -py2.4.egg / django / db / models / query.py,第335行,在get_or_create
obj.save(force_insert = True)
文件/usr/lib/python2.4/ site-packages / Django-1.1.1-py2.4.egg / django / db / models / base.py,第410行,保存
self.save_base(force_insert = force_insert,force_update = force_update)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py,第495行,在save_base
结果中= manager._insert(values,return_id = update_pk)
文件/usr/lib/python2.4/site-packa ges / Django-1.1.1-py2.4.egg / django / db / models / manager.py,第177行,_insert
return insert_query(self.model,values,** kwargs)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py,第1087行,insert_query
返回查询.execute_sql(return_id)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/subqueries.py,行320,在execute_sql
cursor = super(InsertQuery,self).execute_sql(无)
文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4。 egg / django / db / models / sql / query.py,第2369行,在execute_sql
cursor.execute(sql,params)
文件/usr/lib/python2.4/site-packages /Django-1.1.1-py2.4.egg/django/db/backends/mysql/base.py,第84行,执行
return self.cursor.execute(query,args)
文件build / bdist.linux-x86_64 / egg / MySQLdb / cursors.py,第175行,执行
文件build / bdist.linux-x86_64 /egg/MySQLdb/cursors.py,第89行,在_warning_check
文件/usr/lib64/python2.4/warnings.py,第61行,警告
warn_explicit(消息,类别,文件名,lineno,模块,注册表)
文件/usr/lib64/python2.4/warnings.py,第96行,在warn_explicit
raise消息
警告:数据截断为列'名字'$ 1

答案似乎是你可以'在setUp中创建一个管理员用户,但您可以在任何其他功能中,如果您希望管理员用户进行测试,请使用夹具!

解决方案

更新2



执行代码片段,从测试用例( django的子类)中创建超级用户。 test.TestCase )。一切顺利还创建并保存了 UserProfile user = self.adminuser 的实例。



更新



这行很有趣:

 文件/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/ contrib / auth / management / __ init__.py,第28行,create_permissions 
defaults = {'name':name,'content_type':ctype})

看起来执行失败创建权限时。



原始答案


警告:数据被截断在列1的列名称


奇怪。我尝试从Django shell,它为我工作。我在Ubuntu Jaunty上使用Postgresql 8.3和Django 1.2.1。你能给出更多关于你使用哪个版本的Django /数据库的细节?



另外用户没有名称属性。您是否可以仔细检查您是否使用 auth.User


我要加载管理员用户作为固定装置吗?


你不要。但是,如果您只是为了测试目的创建此管理员用户,那么添加Fixture是一个好主意。这就是我在项目中的工作。


I'm trying to create an admin user as part of my tests.py to check on persmissions.

UPDATE: The tests.py is standard format that subclasses TestCase and the code below is called in the setUp() function.

I can create a normal user but not an admin user. If I try this:

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

OR self.adminuser = User.objects.create_superuser('admin', 'admin@test.com', 'pass') self.adminuser.save()

I get:

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

If I remove the is_staff line all is well (except I can't do my test!)

Do I have to load admin users as fixtures?

UserProfile is defined as follows:

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)

and full error traceback is:

    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

The answer seems to be that you can't create an admin user in setUp but you can in any other function so if you want an admin user in testing, use a fixture!

解决方案

Update 2

Executed the snippet to create the superuser from within a test case (subclass of django.test.TestCase). Everything went fine. Also created and saved an instance of UserProfile with user = self.adminuser. That too worked.

Update

This line is interesting:

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

Looks like execution fails when creating permissions.

Original Answer

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

Strange. I tried this from the Django shell and it worked for me. I am using Postgresql 8.3 and Django 1.2.1 on Ubuntu Jaunty. Can you give more details about which version of Django/database are you using?

Also User does not have a name attribute. Can you double check if you are using auth.User?

Do I have to load admin users as fixtures?

You don't have to. But if you are creating this admin user solely for testing purposes then it would be a good idea to add a Fixture. That is what I do in my projects.

这篇关于如何在django tests.py中创建管理员用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆