2010-05-14 56 views
3

我一直在我的項目中使用django-mptt一段時間,這很棒。最近,我發現需要重寫使用MPTT模型的save()方法,當我嘗試保存模型的新實例,我得到一個錯誤:覆蓋使用django-mptt的模型的save()方法

Exception Type: ValueError at /admin/scrivener/page/add/ 
Exception Value: Cannot use None as a query value 

我假設這是事實的結果,即實例還沒有陷入樹中,但我不知道如何去解決這個問題。我在這個項目的追蹤器上添加了一個關於它的評論,但我希望這裏的某個人能夠讓我更快地走上正確的軌道。

這是回溯。

Environment: 

Request Method: POST 
Request URL: http://localhost:8000/admin/scrivener/page/add/ 
Django Version: 1.2 rc 1 SVN-13117 
Python Version: 2.6.4 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.admin', 
'django.contrib.sitemaps', 
'mptt', 
'filebrowser', 
'south', 
'haystack', 
'django_static', 
'etc', 
'scrivener', 
'gregor', 
'annunciator'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware') 


Traceback: 
File "B:\django-apps\3rd Party Source\django\core\handlers\base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "B:\django-apps\3rd Party Source\django\contrib\admin\options.py" in wrapper 
    239.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\utils\decorators.py" in _wrapped_view 
    74.      response = view_func(request, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\views\decorators\cache.py" in _wrapped_view_func 
    69.   response = view_func(request, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\contrib\admin\sites.py" in inner 
    190.    return view(request, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\utils\decorators.py" in _wrapper 
    21.    return decorator(bound_func)(*args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\utils\decorators.py" in _wrapped_view 
    74.      response = view_func(request, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\utils\decorators.py" in bound_func 
    17.     return func(self, *args2, **kwargs2) 
File "B:\django-apps\3rd Party Source\django\db\transaction.py" in _commit_on_success 
    299.      res = func(*args, **kw) 
File "B:\django-apps\3rd Party Source\django\contrib\admin\options.py" in add_view 
    795.     self.save_model(request, new_object, form, change=False) 
File "B:\django-apps\3rd Party Source\django\contrib\admin\options.py" in save_model 
    597.   obj.save() 
File "B:\django-apps\scrivener\models.py" in save 
    205.  self.url = self.get_absolute_url() 
File "B:\django-apps\3rd Party Source\django\utils\functional.py" in _curried 
    55.   return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs)) 
File "B:\django-apps\3rd Party Source\django\db\models\base.py" in get_absolute_url 
    940.  return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\db\models\__init__.py" in inner 
    31.   bits = func(*args, **kwargs) 
File "B:\django-apps\scrivener\models.py" in get_absolute_url 
    194.  for ancestor in self.get_ancestors(): 
File "B:\django-apps\3rd Party Source\mptt\models.py" in get_ancestors 
    23.   opts.tree_id_attr: getattr(self, opts.tree_id_attr), 
File "B:\django-apps\3rd Party Source\django\db\models\manager.py" in filter 
    141.   return self.get_query_set().filter(*args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\db\models\query.py" in filter 
    550.   return self._filter_or_exclude(False, *args, **kwargs) 
File "B:\django-apps\3rd Party Source\django\db\models\query.py" in _filter_or_exclude 
    568.    clone.query.add_q(Q(*args, **kwargs)) 
File "B:\django-apps\3rd Party Source\django\db\models\sql\query.py" in add_q 
    1131.        can_reuse=used_aliases) 
File "B:\django-apps\3rd Party Source\django\db\models\sql\query.py" in add_filter 
    1000.     raise ValueError("Cannot use None as a query value") 

Exception Type: ValueError at /admin/scrivener/page/add/ 
Exception Value: Cannot use None as a query value 

回答

6

解決了這個問題,添加了一個我自定義的保存方法。假如將其從

def save(self, *args, **kwargs): 
    self.url = self.get_absolute_url() 
    super(Page, self).save(*args, **kwargs) 

更改此設置:

def save(self, *args, **kwargs): 
    if not self.id: 
     Page.tree.insert_node(self, self.parent) 
    self.url = self.get_absolute_url() 
    super(Page, self).save(*args, **kwargs) 
0

改變也應該工作的順序,因爲對象應在保存和save() - 方法」不是個返回任何東西得到一個ID!

def save(self, *args, **kwargs): 
    super(Page, self).save(*args, **kwargs)  
    self.url = self.get_absolute_url()