我目前正在开发我的第一个Django项目,并且在将ImageField添加到现有模型方面遇到了障碍。
我目前有一个用户发布内容的模型和一个用于django-profiles的模型。对于前者,我添加了一个ImageField,以便使用的可以提交照片以伴随文本内容。对于后者,我想允许用户上传个人资料照片(目前不担心有关头像调整大小)。
在我将ImageFields添加到两个模型之前,情况一直很顺利。然后我与南方同步数据库。当我尝试为配置文件提取曾经工作的模板时产生的结果是:
“没有这样的专栏: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。)
非常感谢。
答案 0 :(得分:3)
如果添加数据库中不存在的列(syncdb不更新数据库列),这正如您所期望的那样。
如果这是关于django south的问题,你应该将它添加到标签中,并添加更多关于你在南方所做的失败的背景。
对于南方来说这应该是一个简单的操作:
python manage convert_to_south myapp
(或manage.py schemamigration myapp --initial
,然后python manage migrate myapp --fake
)python manage schemamigration myapp --auto
python manage migrate myapp
如果你只是想在没有南方的情况下让它工作,你还有其他两个选择..
手动将列添加到数据库或重置数据库表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中更改它。