将ImageField添加到Django模型会导致错误

时间:2012-03-03 01:44:38

标签: python django django-models django-profiles

我目前正在开发我的第一个Django项目,并且在将ImageField添加到现有模型方面遇到了障碍。

我目前有一个用户发布内容的模型和一个用于django-profiles的模型。对于前者,我添加了一个ImageField,以便使用的可以提交照片以伴随文本内容。对于后者,我想允许用户上传个人资料照片(目前不担心有关头像调整大小)。

在我将Im​​ageFields添加到两个模型之前,情况一直很顺利。然后我与南方同步数据库。当我尝试为配置文件提取曾经工作的模板时产生的结果是:

“没有这样的专栏:report_userprofile.profile_pic”

尝试查看提交的文本内容时发生类似的错误。

我将这两个字段设置为“blank = True”,因此好像没有图像文件就不会导致错误。我显然错了。

我最初没有把这些字段放在模型中,事后看来这是一个很大的错误。我还设置了MEDIA_ROOT和MEDIA_URL,如下所示:

MEDIA_ROOT = 'os.path.join(BASE_DIR, "media")'

MEDIA_URL = 'http://localhost:8000/media'

我现在使用的模型是:

class Story(models.Model):
title = models.CharField(max_length=100)
topic = models.CharField(max_length=50)
copy = models.TextField()
author = models.ForeignKey(User)
zip_code = models.CharField(max_length=10)
latitude = models.FloatField(blank=False, null=False)
longitude = models.FloatField(blank=False, null=False)
date = models.DateTimeField(auto_now=True, auto_now_add=True)
pic = models.ImageField(upload_to='pictures', blank=True)   
def __unicode__(self):
    return " %s" % (self.title)

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
first_name = models.CharField(max_length=25)
last_name = models.CharField(max_length=35)
email = models.EmailField()
birth_date = models.DateField(blank=True, null=True)
city = models.CharField(max_length=25)
state = models.CharField(max_length=20)
zip_code = models.CharField(max_length=10)
profile_pic = models.ImageField(upload_to='pictures', blank=True)

URL文件的设置如下:

    url(r'^admin/', include(admin.site.urls)),

(r'^media/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root': settings.MEDIA_ROOT},

这里的核心问题是我不知道错误是什么(以前的模板甚至?)。或者更好的是,错误,因为我确信我做了几个。现在它有点像汤,伴随着由此产生的痛苦。

就像一个FYI,我已经安装了PIL。

任何洞察力,甚至是小见解,我都需要做些什么来纠正这种情况,这是不可理解的。我搜索过类似的问题,但没有一个具体问题出现。 (未来的第一个教训是在最初组装模型时显然要设置ImageFiles。)

非常感谢。

2 个答案:

答案 0 :(得分:3)

如果添加数据库中不存在的列(syncdb不更新数据库列),这正如您所期望的那样。

如果这是关于django south的问题,你应该将它添加到标签中,并添加更多关于你在南方所做的失败的背景。

对于南方来说这应该是一个简单的操作:

  1. 注释掉ImageField
  2. 运行python manage convert_to_south myapp(或manage.py schemamigration myapp --initial,然后python manage migrate myapp --fake
  3. 取消注释ImageField;
  4. 运行python manage schemamigration myapp --auto
  5. 运行python manage migrate myapp
  6. 如果你只是想在没有南方的情况下让它工作,你还有其他两个选择..

    手动将列添加到数据库或重置数据库表manage.py reset myapp - 删除所有数据。

    如果运行python manage.py sqlall myapp命令,则手动修改数据库非常容易 - 它将列出用于构建表的SQL,因此您可以将缺少的字段行复制并粘贴到python manage.py dbshell如果将关键部分转换为alter table语句,则会话(在您的情况下为sqlite3)。

答案 1 :(得分:0)

如果您更改了类结构,则需要重建数据库或更改数据库表以反映您对类所做的更改。该错误正在告诉您究竟是什么问题。该列不在表中。 syncdb不会这样做。最简单的方法是:

manage.py reset table_name

table_name是{app} _ {class}。这将删除所有当前数据。如果您想要更改数据,则需要在您正在使用的任何数据库shell中更改它。