2012-03-03 38 views
1

我目前正在處理我的第一個Django項目,並且在將ImageField添加到現有模型方面遇到了障礙。將ImageField添加到Django模型導致錯誤

我目前有一個用戶發佈內容的模型,一個用於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) 

中的URL文件設置如下:

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

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

這裏的核心問題是我不知道錯誤可能是什麼(以前的模板甚至?)。或者更好,錯誤,因爲我確信我已經做了幾個。現在這是一種湯,伴隨着這種痛苦。

就像一個供參考,我已經安裝了PIL。

任何洞察力,甚至小洞察力,到我需要做的事情來彌補這種情況將不勝感激。我已經搜索過類似的問題,但沒有一個具體的問題出現。 (對於未來的第一課是在初始組裝模型時明顯設置ImageFiles。)

非常感謝。

回答

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. 運行

如果你只是想使它未經南華工作,你還有其他2個選項..

列手動添加到您的數據庫或重置數據庫表manage.py reset myapp - 刪除所有數據。

手動修改DB很容易,如果你運行python manage.py sqlall myapp命令 - 它會列出用於構建表的SQL,所以你可以丟失場線複製並粘貼到一個python manage.py dbshell會話(在你的情況,sqlite3的)如果您將關鍵部分轉換爲alter table語句。

0

如果您改變了類結構,您將需要重建數據庫或更改數據庫表以反映您對類所做的更改。錯誤告訴你到底是什麼問題。該列不在表格中。 syncdb不會這樣做。最簡單的方法是:

manage.py reset table_name 

table_name是{app} _ {class}。這將刪除所有當前數據。如果你想改變數據,你需要在你使用的任何數據庫shell中進行修改。

+0

謝謝。所以這會重置整個「故事」類,讓它變空(沒關係)。我使用sqlite3,並且我聽說使用South來更改數據庫模型時可能會很麻煩。那裏有其他明顯的錯誤嗎?我總覺得有更多的事情搞砸了(比如我發起這些改變的順序)。 – 2012-03-03 02:35:53

+0

很難說出潛藏的其他危險。我也沒有足夠的經驗與南能夠猜測你做錯了什麼。很清楚,它沒有正確管理遷移。 – 2012-03-03 02:43:13

相關問題