2013-01-03 12 views
5

जब मैं कोशिश करते हैं और (Django मानक व्यवस्थापक इंटरफ़ेस का उपयोग कर) को बचाने मैं निम्नलिखित त्रुटि मिलती है मिल गया ...Django व्यवस्थापक त्रुटि को बचाने: get_db_prep_value() एक अप्रत्याशित कीवर्ड तर्क 'कनेक्शन'

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

get_db_prep_value() got an unexpected keyword argument 'connection' 

कोई समझा सकते हैं यह मेरे लिए, क्यों और शायद एक संभावित समाधान? मुझे लगता है कि यह मेरे कस्टम HibernateBooleanField क्षेत्र के साथ कुछ करने के लिए है।

नीचे पूर्ण त्रुटि और विवरण।

त्रुटि

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

मैं to_python() विधि की तरह। :) –

उत्तर

8

हाँ, वह एक निष्पक्ष धारणा होगा। जैसा कि आप the source code से देख सकते हैं, उस विधि का हस्ताक्षर def get_db_prep_value(self, value, connection, prepared=False) है, इसलिए किसी भी उप-वर्ग को या तो एक ही तर्क की अपेक्षा करने की आवश्यकता है या *args, **kwargs लेना आवश्यक है।

+0

Django के लिए नया, तर्कों को हल/पास करने का सबसे अच्छा तरीका क्या है? – Prometheus

+0

मुझे प्रश्न समझ में नहीं आता है। सबसे अच्छा तरीका है कि आपकी विधि हस्ताक्षर बेस क्लास के समान ही बनाएं। –

+0

मैं इसके लिए विधि हस्ताक्षर जोड़/बदलूं? – Prometheus

8

डैनियल रोज़मन ने काफी जवाब दिया, लेकिन मैं इसे किसी अन्य तरीके से बताऊंगा और अधिक शब्दों का उपयोग करूंगा ताकि आप उम्मीदपूर्वक समझ सकें। Django 1.4.x में कस्टम फ़ील्ड के लिए, आपके कस्टम फ़ील्ड के get_db_prep_value फ़ंक्शन अब 4 पैरामीटर स्वीकार करें। Django 1.2 में, Django डेवलपर्स कई डेटाबेस समर्थन पेश किया। Django 1.4.x में, डेवलपर्स को हटाया गया कोड जो आपके कार्य घोषणा को काम करने की अनुमति देता।

तो आपको क्या करने की ज़रूरत है? अतिरिक्त तर्क स्वीकार करने के लिए आपको HibernateBooleanField.get_db_prep_value को फिर से परिभाषित करने की आवश्यकता है। अपने get_db_prep_value समारोह बदले की तरह मैं नीचे है, और इसे काम करेंगे :)

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

Django प्रलेखन संदर्भ: https://docs.djangoproject.com/en/1.2/howto/custom-model-fields/#django.db.models.Field.get_db_prep_value

+0

+1 बेहतर स्पष्टीकरण के लिए धन्यवाद, मैं आपके उदाहरण के साथ अपने मुद्दे को हल करने में सक्षम था – AWainb

संबंधित मुद्दे