Поле файла модели django с ошибкой в БД
Я использую django 1.4 и использую файловое поле модели django для загрузки некоторого документа через модель. У меня следующие проблемы:
Когда я отправляю форму, она говорит:
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, в то время как он просто сохраняет его с именем по своему выбору, но мне нужно также сохранить имена в db, поэтому я хочу назвать их по своему выбору. Как это можно сделать и какова проблема в моем коде, который дает вышеупомянутую ошибку?
1 ответ
Как долго это file_name
вы пытаетесь хранить?
По умолчанию экземпляры FileField создаются как столбцы varchar(100) в вашей базе данных. Как и в других полях, вы можете изменить максимальную длину, используя аргумент max_length. Это может привести к ошибке усечения данных.
Также вы можете переименовать ваш файл как хотите. upload_to
может быть вызываемым, который принимает экземпляр и имя загруженного файла в качестве входных данных, а затем вы можете указать точное имя и путь, который вы хотите сохранить.
Например.
def get_file_name(instance, filename):
return '/'.join(['blah', instance.user.username, filename])
...
file_name=models.FileField(upload_to=get_file_name)
...