我是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()
感谢您提前提供的任何帮助,我真的很感激!
答案 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:”代替。看到这些相关链接。
http://docs.djangoproject.com/en/dev/ref/models/instances/#the-pk-property
这有多大帮助。
答案 1 :(得分:1)
我想知道你的super()
行是否有缩进错误 - 你有标签和空格混淆了吗?
启动服务器,即使输入super(IDONTEXIST, self)
,也不应该在调用save()
之前抛出错误。
如果我对超线进行去缩进,我可以重现你的错误。