Python Django admin保存错误:get_db_prep_value()获取了意外的关键字参数';连接';
当我尝试保存(使用Django标准管理界面)时,我得到以下错误Python Django admin保存错误:get_db_prep_value()获取了意外的关键字参数';连接';,python,django,django-admin,Python,Django,Django Admin,当我尝试保存(使用Django标准管理界面)时,我得到以下错误 TypeError at /admin/web/campaign/dc6eb21f-87fa-462f-88af-416cf6be37f6/ get_db_prep_value() got an unexpected keyword argument 'connection' 有人能给我解释一下,为什么,也许还有一个可能的解决办法?我想这和我在安菲尔德球场的习惯有关 完整错误和详细信息如下 错误 Environment: R
TypeError at /admin/web/campaign/dc6eb21f-87fa-462f-88af-416cf6be37f6/
get_db_prep_value() got an unexpected keyword argument 'connection'
有人能给我解释一下,为什么,也许还有一个可能的解决办法?我想这和我在安菲尔德球场的习惯有关
完整错误和详细信息如下
错误
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/web/campaign/dc6eb21f-87fa-462f-88af-416cf6be37f6/
Django Version: 1.4.2
Python Version: 2.7.2
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.flatpages',
'django.contrib.messages',
'django.contrib.staticfiles',
'grappelli.dashboard',
'grappelli',
'django.contrib.admin',
'django.contrib.admindocs',
'web')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in wrapper
366. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
89. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/sites.py" in inner
196. return view(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapper
25. return bound_func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in _wrapped_view
91. response = view_func(request, *args, **kwargs)
File "/Library/Python/2.7/site-packages/django/utils/decorators.py" in bound_func
21. return func(self, *args2, **kwargs2)
File "/Library/Python/2.7/site-packages/django/db/transaction.py" in inner
209. return func(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in change_view
1054. self.save_model(request, new_object, form, True)
File "/Library/Python/2.7/site-packages/django/contrib/admin/options.py" in save_model
709. obj.save()
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save
463. self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in save_base
529. rows = manager.using(using).filter(pk=pk_val)._update(values)
File "/Library/Python/2.7/site-packages/django/db/models/query.py" in _update
560. return query.get_compiler(self.db).execute_sql(None)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
986. cursor = super(SQLUpdateCompiler, self).execute_sql(result_type)
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
808. sql, params = self.as_sql()
File "/Library/Python/2.7/site-packages/django/db/models/sql/compiler.py" in as_sql
951. val = field.get_db_prep_save(val, connection=self.connection)
File "/Library/Python/2.7/site-packages/django/db/models/fields/__init__.py" in get_db_prep_save
292. prepared=False)
Exception Type: TypeError at /admin/web/campaign/dc6eb21f-87fa-462f-88af-416cf6be37f6/
Exception Value: get_db_prep_value() got an unexpected keyword argument 'connection'
型号
class Campaign(models.Model):
campaignid = models.CharField(max_length=255, primary_key=True, db_column='campaignID')
name = models.CharField(max_length=105)
active = HibernateBooleanField(default=False)
created = models.DateTimeField()
modified = models.DateTimeField(null=True, blank=True)
companyid = models.ForeignKey(Company, null=True, db_column='companyID', blank=True)
class Meta:
db_table = u'campaign'
def __unicode__(self):
return self.name
class HibernateBooleanField(models.BooleanField):
__metaclass__ = models.SubfieldBase
def get_internal_type(self):
return "HibernateBooleanField"
def db_type(self):
return 'bit(1)'
def to_python(self, value):
if value in (True, False): return value
if value in ('t', 'True', '1', '\x01'): return True
if value in ('f', 'False', '0', '\x00'): return False
def get_db_prep_value(self, value):
return 0x01 if value else 0x00
是的,这是一个公平的假设。从中可以看出,该方法的签名是
def get\u db\u prep\u value(self、value、connection、prepared=False)
,因此任何子类都需要期望相同的参数,或者使用*args、**kwargsDaniel Roseman回答了这个问题,但我会用另一种方式陈述,并用更多的词,以便你们能理解。对于Django 1.4.x中的自定义字段,自定义字段的get_db_prep_value函数现在必须接受4个参数。在Django 1.2中,Django开发人员引入了多数据库支持。在Django 1.4.x中,开发人员删除了允许函数声明工作的代码
那么你需要做什么呢?您需要重新定义HibernateBooleanField.get_db_prep_值以接受额外的参数。像下面一样更改get_db_prep_value函数,它就会工作:)
Django文档参考:Django新手,解决/传递args的最佳方法是什么?我不理解这个问题。最好的方法是使您的方法签名与基类相同。在哪里添加/更改此方法的方法签名?什么?在您对该方法的定义中,还有什么地方?我喜欢to_python()方法:+谢谢你更好的解释,我用你的例子解决了我的问题
def get_db_prep_value(self, value, connection, prepared=False):
return 0x01 if value else 0x00