为什么Django中的Model.save()函数的覆盖不起作用?

时间:2011-03-27 19:22:15

标签: python django django-models

我是SO和Python / Django的新手,所以请耐心等待。

在我基于http://www.djangoproject.com/教程的通用博客应用程序中,我试图通过在帖子标题上使用slugify()方法将帖子保存到数据库中来创建帖子。这是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。我以为我使用的是super()方法错误,但这很有效,尽管它看起来像我在尝试的那样:

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()

感谢您提前提供的任何帮助,我真的很感激!

2 个答案:

答案 0 :(得分: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

另一点,而不是使用“if not self.id:”,通常更好的做法是使用“if not self.pk:”代替。看到这些相关链接。

Django queries - id vs pk

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

这有多大帮助。

答案 1 :(得分:1)

我想知道你的super()行是否有缩进错误 - 你有标签和空格混淆了吗?

启动服务器,即使输入super(IDONTEXIST, self),也不应该在调用save()之前抛出错误。

如果我对超线进行去缩进,我可以重现你的错误。