2011-03-27 34 views
3

我是SO和Python/Django的新手,請耐心等待。爲什麼Django中的Model.save()函數的重寫不能工作?

在我的基於教程http://www.djangoproject.com/的通用博客應用中,我試圖通過在帖子標題中使用slugify()方法將帖子保存到數據庫時爲帖子創建slu gs。這裏是posts.models.py:

from django.db import models 
from django.template.defaultfilters import slugify 
import datetime 

class Post(models.Model): 

    def __unicode__(self): 
     return self.title 

    title = models.CharField(max_length = 200) 
    slug = models.SlugField(editable = False) 
    body = models.TextField() 
    pub_date = models.DateTimeField('date published') 

    def save(self, *args, **kwargs): 
     if not self.id: 
      self.slug = slugify(self.title) 
     super(Post, self).save(*args, **kwargs) 

不幸的是,在試圖啓動服務器拋出以下異常:

File "/Users/modocache/Programming/Django/blog/posts/models.py", line 24, in Post 
super(Post, self).save(*args, **kwargs) 
NameError: name 'Post' is not defined 

我很困惑,爲什麼NameError異常。我以爲我用的是超()方法錯了,但這個作品,儘管它似乎像我試圖上面同樣的事情:

class Foo(object): 
    def say_spam(self): 
     print "Spam!" 

class Bar(Foo): 
    def say_spam(self): 
     print "Brought to you by:" 
     super(Bar, self).say_spam() 
     print "Eggs!" 

b = Bar() 
b.say_spam() 

所以,如果這個工程,爲什麼不上Django的片段失敗?這是特別令人費解考慮djangoproject.com的文件說,這應該工作:

# http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods 

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def save(self, *args, **kwargs): 
     do_something() 
     super(Blog, self).save(*args, **kwargs) # Call the "real" save() method. 
     do_something_else() 

感謝提前任何及所有的幫助,我會很感激!

回答

3

modocache,

您使用的是什麼版本的django?你在那裏列出的應該工作,我在我自己的許多模型中使用相同的邏輯,並且它工作正常。

根據此頁:http://fosshelp.blogspot.com/2010/12/django-override-save-method-two-ways.html

你應該能夠更改代碼看起來像這樣(下圖),它會做同樣的事情,但不會引用Post模型。

def save(self, *args, **kwargs): 
    if not self.id: 
     self.slug = slugify(self.title) 
    models.Model.save(self, *args, **kwargs) # <-- notice the self 

另一點,而不是使用「如果不self.id:」通常更好的做法是使用「如果不是self.pk:」代替。看到這些相關的鏈接。

Django queries - id vs pk

http://docs.djangoproject.com/en/dev/ref/models/instances/#the-pk-property

如何幫助。

+0

謝謝,我現在有我最好的網址! 根據你的建議,我將super()更改爲models.Model.save(),現在一切正常。不過,我的模型和你的模型之間明顯的不一致。我使用的是Django 1.3: In [5]:import django In [6]:django.get_version() Out [6]:'1.3' 感謝所有的酷鏈接和pk上的提示!這是一個很大的幫助。 – modocache 2011-03-27 21:16:20

1

我想知道如果你在你的super()行有縮進錯誤 - 你有選項卡和空格混合?

一旦啓動服務器即使輸入super(IDONTEXIST, self)也不應該拋出錯誤,直到調用save()

如果我取消縮進超級行,我可以重現您的錯誤。

+0

感謝您的幫助!取消縮進線允許我啓動服務器,但是存在功能性問題 - 只有當該文章是新記錄時,模型纔會保存!考慮到現有記錄具有self.id(或self.pk),因此繞過save()方法,這是有道理的。 – modocache 2011-03-27 21:12:17

+0

沒問題,那是你那裏的神祕錯誤。 「功能性問題」是一種常見的做法,只能在新帖子或顯式更改中設置一個子彈。 – 2011-03-27 22:23:03

相關問題