2013-01-03 5 views
5

Wenn ich versuche, und zu speichern (die Django Standard Admin-Schnittstelle) ich folgende Fehlermeldung erhalten ...Django Admin-Fehler speichern: get_db_prep_value() bekam ein unerwartetes Stichwort Argument ‚Verbindung‘

TypeError at /admin/web/campaign/dc6eb21f-87fa-462f-88af-416cf6be37f6/ 

get_db_prep_value() got an unexpected keyword argument 'connection' 

Könnte jemand erklären dies für mich, warum und vielleicht eine mögliche Lösung? Ich gehe davon aus, dass es etwas mit meinem benutzerdefinierten HibernateBooleanField-Feld zu tun hat.

Vollständige Fehler und Details unten.

Fehler

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' 

Modell

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 
+2

Ich mag die to_python() -Methode. :) –

Antwort

8

Ja, dass eine faire Annahme wäre. Wie Sie aus the source code sehen können, ist die Signatur dieser Methode def get_db_prep_value(self, value, connection, prepared=False), so dass jede Unterklasse entweder dieselben Argumente erwarten oder *args, **kwargs übernehmen muss.

+0

Neu bei Django, was ist der beste Weg, um die Argumente zu lösen? – Prometheus

+0

Ich verstehe die Frage nicht. Der beste Weg ist, die Methodensignatur gleich der Basisklasse zu machen. –

+0

Wo füge ich die Methodensignatur hinzu oder ändere sie? – Prometheus

8

Daniel Roseman hat das ziemlich beantwortet, aber ich werde es auf eine andere Weise erklären und mehr Wörter verwenden, damit Sie hoffentlich verstehen. Für benutzerdefinierte Felder in Django 1.4.x muss die Funktion get_db_prep_value Ihres benutzerdefinierten Felds jetzt 4 Parameter annehmen. In Django 1.2 haben die Django-Entwickler mehrere Datenbank-Unterstützung eingeführt. In Django 1.4.x haben die Entwickler REMOVED-Code entfernt, der Ihrer Funktionsdeklaration erlaubt hätte zu funktionieren.

Was müssen Sie tun? Sie müssen HibernateBooleanField.get_db_prep_value neu definieren, um die zusätzlichen Argumente zu akzeptieren. Ändern Sie Ihre get_db_prep_value Funktion wie ich unten haben, und es wird funktionieren :)

def get_db_prep_value(self, value, connection, prepared=False): 
    return 0x01 if value else 0x00 

Django Dokumentation Referenz: https://docs.djangoproject.com/en/1.2/howto/custom-model-fields/#django.db.models.Field.get_db_prep_value

+0

+1 Vielen Dank für die bessere Erklärung, ich war in der Lage, mein Problem mit Ihrem Beispiel zu lösen – AWainb

Verwandte Themen