Добавление ImageField к моделям Django приводит к ошибке - PullRequest
1 голос
/ 03 марта 2012

В настоящее время я работаю над своим первым проектом Django и преодолел препятствия на пути добавления ImageField к существующей модели.

В настоящее время у меня есть модель для публикации контента пользователем и модель для django-профилей. Для первого я добавил 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},

Основная проблема здесь заключается в том, что я понятия не имею, в чем может быть ошибка (даже предыдущие шаблоны?). Или, еще лучше, ошибок, так как я уверен, что я сделал несколько. Сейчас это что-то вроде супа, а вместе с ним и бедствия.

Так же, как к вашему сведению, я установил PIL.

Любое понимание, даже небольшое, о том, что мне нужно сделать, чтобы исправить эту ситуацию, было бы за пределами понимания. Я искал похожие проблемы, но ни одна эта конкретная проблема не появляется. (Первым уроком на будущее будет, очевидно, настройка ImageFiles при первоначальной сборке моделей.)

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Это именно то, что вы ожидаете, если добавите столбец, который не существует в базе данных (syncdb не обновляет столбцы базы данных).

Если это вопрос о юге Джанго, вы должны добавить его в теги и добавить дополнительную информацию о том, что вы сделали на юге, но не удалось.

Это должна быть простая операция для юга:

  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

Если вы просто пытаетесь заставить его работать без юга, у вас есть 2 других варианта ..

Вручную добавить столбец в базу данных или сбросить таблицу базы данных. manage.py reset myapp - удалить все данные.

Вручную изменить базу данных очень легко, если вы запустите команду python manage.py sqlall myapp - в ней будет указан SQL, использованный для построения таблицы, поэтому вы можете скопировать и вставить недостающую строку поля в сеанс python manage.py dbshell (в вашем case, sqlite3), если вы преобразуете ключевые части в оператор изменения таблицы.

0 голосов
/ 03 марта 2012

Если вы изменили структуру класса, вам нужно будет перестроить базу данных или изменить таблицы базы данных, чтобы отразить изменения, которые вы внесли в свой класс.Ошибка говорит вам точно, в чем проблема.Столбца нет в таблице.syncdb не будет этого делать.Самый простой способ сделать это:

manage.py reset table_name

table_name это {app} _ {class}.Это удалит все текущие данные.Если вы хотите изменить данные на месте, вам нужно будет изменить их в любой оболочке базы данных, которую вы используете.

...