2012-10-07 84 views
0

我正在使用django 1.4並使用django模型的filefield通過modelform上傳一些文檔。我有以下問題:django模型filefield有數據庫錯誤

當我提交表單,它說:

Data truncated for column 'file_name' at row 1 

以下是我對這個模型:

class App(models.Model): 
    user_name=models.CharField(max_length=50) 
    email=models.CharField(max_length=50) 
    status=models.CharField(max_length=10,choices=APPLICATIONSTATUSCHOICE) 
    archived=models.BooleanField() 
    mark_spam=models.BooleanField() 
    date=models.DateField() 
    file_name=models.FileField(upload_to=PATH+"/") 
    def getPath(self): 
     return PATH 
    def __unicode__(self): 
     return self.user_name 
    def send_email(self): 
     pass 

下面是標準格式的代碼:

class AppForm(ModelForm): 
    class Meta: 
    model=App 
     exclude=('status','archived','mark_spam') 

email=forms.EmailField() 

    def save(self,commit=True): 
     app=super(AppForm,self).save(commit=False) 
    app.status='sent' 
     app.save() 

此外,它存儲文件的原始名稱,我可以用一些獨特的名稱,因爲我是從PHP黑色一輪和PHP我通常保存它像<mysql auto id>.<filextension>,所以我怎麼能在Django中做到這一點。我的第一印象是,所有這些將通過django自動完成,而它只是用自己選擇的名稱保存它,但我需要將名稱保存到數據庫中,所以我想根據自己的選擇命名。如何做到這一點,以及我的代碼中出現上述錯誤的問題是什麼?

回答

1

您試圖存儲的file_name多長時間?

默認情況下,FileField實例在數據庫中創建爲varchar(100)列。與其他字段一樣,您可以使用max_length參數更改最大長度。這可能會導致數據截斷錯誤。

此外,你可以重新命名你的文件,無論你想要的。 upload_to可以是callable,它將實例和上傳文件的名稱作爲輸入,然後您可以指定要存儲的確切名稱和路徑。

例如,

def get_file_name(instance, filename): 
    return '/'.join(['blah', instance.user.username, filename]) 

... 
    file_name=models.FileField(upload_to=get_file_name) 
... 
+0

在我的數據庫是爲varchar(50),也是我剛纔看到它insesrting完整路徑,我的文件不只是名字,這似乎不正確的行爲,是嗎?也根據app_id上傳文件,那麼我是否需要先單獨插入記錄?得到它的自動遞增的id或django有東西嗎? – Hafiz

+1

你使用了什麼樣的數據庫,試着指定一個'max_length = 200'並重新創建表格或者使用南方語言進行遷移。文件路徑通常與'settings.py'中指定的'MEDIA_PATH'相關 –