【问题标题】:Adding ImageField to Django Models Results in Error将 ImageField 添加到 Django 模型会导致错误
【发布时间】:2012-03-03 01:44:38
【问题描述】:

我目前正在处理我的第一个 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。)

非常感谢。

【问题讨论】:

    标签: python django django-models django-profiles


    【解决方案1】:

    这与您添加数据库中不存在的列完全一样(syncdb 不会更新数据库列)。

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

    这应该是一个简单的南方操作:

    1. 注释掉 ImageField
    2. 运行python manage convert_to_south myapp(或manage.py schemamigration myapp --initial,然后运行python manage migrate myapp --fake
    3. 取消注释图像字段;
    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 会话中(在您的case, sqlite3) 如果您将关键部分转换为 alter table 语句。

    【讨论】:

      【解决方案2】:

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

      manage.py reset table_name
      

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

      【讨论】:

      • 谢谢。所以这将重置整个“故事”类,将其留空(没关系)。我正在使用 sqlite3,我听说使用 South 更改数据库模型时可能会很麻烦。那里还有其他明显的错误吗?不知何故,我觉得我搞砸了更多(例如我启动这些更改的顺序)。
      • 很难说还有什么危险潜伏着。我也没有足够的南方经验来猜测你做错了什么。很明显,它没有正确管理迁移。
      猜你喜欢
      • 2014-02-16
      • 2016-08-11
      • 1970-01-01
      • 2018-11-02
      • 2020-10-02
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多