1

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

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

在我将 ImageFields 添加到两个模型之前,一切都运行良好。然后我将数据库与 South 同步。当我尝试为配置文件提取曾经工作的模板时,结果是:

“没有这样的列: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)

URLs 文件设置如下:

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

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

这里的核心问题是我不知道错误可能是什么(甚至以前的模板?)。或者更好的是,错误,因为我确信我已经犯了几个。现在有点像汤了,随之而来的痛苦。

仅供参考,我已经安装了 PIL。

对我需要做些什么来补救这种情况的任何洞察力,即使是很小的洞察力,都将不胜感激。我已经搜索过类似的问题,但没有出现这个具体问题。(未来的第一课显然是在最初组装模型时设置 ImageFiles。)

非常感谢。

4

2 回答 2

4

如果添加数据库中不存在的列(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

如果您只是想让它在没有 South 的情况下工作,那么您还有 2 个其他选择..

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

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

于 2012-03-03T04:37:58.083 回答
0

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

manage.py reset table_name

table_name 是 {app}_{class}。这将删除所有当前数据。如果您想就地更改数据,则需要在您使用的任何数据库外壳中对其进行更改。

于 2012-03-03T01:53:12.790 回答