2010-08-17 91 views
3

我正在使用Django构建一个小型Web项目,该项目有一个包含ImageField的模型(Image)。当我尝试使用管理界面,我提出这个问题上传图片(个人识别信息删除):超过Django最大递归深度

RuntimeError at /admin/main/image/add/ 

maximum recursion depth exceeded 

Request Method:  POST 
Request URL: http://x.x.x.x:8080/blog/admin/main/image/add/ 
Django Version:  1.2.1 
Exception Type:  RuntimeError 
Exception Value:  

maximum recursion depth exceeded 

Exception Location:  /extra/django/blog/main/models.py in __unicode__, line 26 
Python Executable: /usr/bin/python 
Python Version:  2.4.3 
Python Path: ['/extra/django', '/usr/lib/python2.4/site-packages/setuptools-0.6c11-py2.4.egg', '/usr/lib/python2.4/site-packages/MySQL_python-1.2.3-py2.4-linux-i686.egg', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/usr/lib/python2.4/site-packages/PIL', '/usr/lib/python2.4/site-packages/gtk-2.0'] 
Server time: Tue, 17 Aug 2010 13:30:20 -0400 

这是我models.py的一部分:

class Image(models.Model): 
image = models.ImageField(upload_to='uploads/blog_images') 
caption = models.CharField(max_length=300) 
post = models.ForeignKey('Post') 
thumbWidth = models.IntegerField(blank=True,null=True) 
thumbHeight = models.IntegerField(blank=True,null=True) 
def printTag(self, newClass=''): 
    str = '<img ' 
    if newClass is not '': 
     str = str + 'class="%s" ' %newClass 
    if self.thumbWidth is not None and self.thumbHeight is not None: 
     str += 'width="%i" height="%i" ' %(self.thumbWidth,self.thumbHeight) 
    str = str + 'src="%s" ' %self.image 
    str = str + '>%s</img>' %self.caption 
    return str 
def __unicode__(self): 
    return self.printTag(self) 

线26是unicode中唯一的一行。我有额外的功能(printTag),所以我可以选择是否打印带有“class”属性的HTML标签,默认情况下不带该属性。为什么在我上传图片时递归?

+0

请解决您的压痕。你的代码很难阅读。 – 2010-08-17 18:14:08

回答

4

你需要return self.printTag()没有return self.printTag(self)

+2

为了更清楚(现在我回到了我的电脑),您的printTag()方法属于模型,并且因此隐式地将自己作为第一个参数。通过调用self.printTag(self),这意味着该对象也被接受为* second *参数,这意味着您的代码认为它是newClass,然后再次尝试拼接对象的__unicode__表示形式(如newClass),这会导致递归。 – 2010-08-17 21:23:18

+0

就是这样。感谢您的解释。 – Puddingfox 2010-08-17 21:44:12