Итак приступим).
Здесь я опушу как создавал модели и как просто (на мой взгляд) задавать динамический путь для upload_to (использовалась БД PostgreSQL).
Для начала, опишем какие модели использовались
models.py:
class User(models.Model):
publication_date = models.DateField(auto_now_add=True)
.......
nick = models.CharField(max_length=50)
#auto_now_add=True - автоматически сохраняет текущую дату в поле publication_date, при записи в #БД.
#Следующая модель:
class Ident(models.Model):
user = models.ForeignKey('User')
img = models.ForeignKey('Image')
..........
request_file = models.FileField(upload_to=txt_ident_get_upload_to)
models.ForeignKey('User') - используется для создания ключа (один ко многим) к таблице User. Аналогично Image PrimaryKey не используется. Так как, втоматически создается поле id (User.id, Ident.id) по #которому легко можжно однозначно идентифицировать запись.
Функция, создающая динамический путь кфайлу.
def txt_ident_get_upload_to(instance, filename):
nick= instance.user.nick #так определяется текущий юзер, в поле nick таблицы User
tmpnomer = Img.objects.aggregate(models.Max('nomer'))['nomer__max']# http://docs.djangoproject.com/en/1.3/topics/db/aggregation/
return os.path.join('user', nick, 'idn', str( tmpnomer )+".txt") #Возвращаем функции значени пути к файлу и название текстового файла str( tmpnomer )+".txt"
tmpnomer = tmpnomer + 1 if tmpnomer else 1 - можно использовать, еси до этого в таблицу не вносились данные и там ничего еще не записано. У меня в данном случае это не использовалесь
return os.path.join('user', nick, 'idn', str( tmpnomer )+".txt") #Возвращаем функции значени пути к файлу и название текстового файла str( tmpnomer )+".txt"
Также необходимо импортировать библиотеку для работы с директориями и файлами: import os
Теперь модуль views.py.
Cоздадим специальный файл и сохраним его с помощью upload_to
metadata = u"""{0} {1} {2} #Вместо цифр используются значения полей формы, в таком же порядке, Питоновский способ записи данных
Дата подачи заявки: {4}
""".format(tmpdata.sername, tmpdata.name, tmpdata.ssername, pimg.publication_date) #Значения этих поле подставяться вместо цифр. Значение берется из БД
Импортируем библиотеку для создания временных файлов
from django.core.files.uploadedfile import SimpleUploadedFile
upload_file = SimpleUploadedFile(str(tmpnomer), smart_str(metadata), content_type='text/plain')# Cоздаем специфльный файл
Первое значение - название файла
Второе - умная строка, содержимое файла:http://docs.djangoproject.com/en/1.3/ref/models/instances/
Третья -тип содержимого
Подставляем файл в модель при записи:
ident = Ident(user_id=pdata.user_id, request_file=upload_file)
ident.save()
Все), Файл сохранен по динамическому пути.
В функцию def txt_ident_get_upload_to(instance, filename) можно вставлять любые условя для определения пути, по которому файл сохраниться
Привет. Я вот тоже только пару дней как с django :) А не мог бы ты по подробнее описать view.py я пока не совсем с эти разобрался.
ОтветитьУдалитьСпасибо.
С удовольствием. Только просьба подписываться, чтобы я мог к тебе нормально обращаться).
ОтветитьУдалитьИтак, С моделями я думаю все понятно. там главное - эьто поле с upload_to. Для формированя пути к нему используй функцию txt_ident_get_upload_to или напиши аналогичную. Во views.py, в моём случае использовались данные из БД - Data.
Берешь конкретное, существующее значение из БД: tmpdata = Data.objects.get(nick="user")- например.
Далее создаешь переменную, содержащую необходиму информацию из БД (см. выше - metadata). Далее, формируешь simple-файл. Для этого пишешь во views.py: from django.core.files.uploadedfile import SimpleUploadedFile.
Передаешь содержимое и имя файла в поле с upload_to (см. выше upload_file)
Привет еще раз. Все со все разобрался. Появился новый вопрос, на счет ForeignKey, не могу понять как отобразить все это в templete. Когда модель отображаю все отлично, но вот Key отображается выпадающим списком :(
ОтветитьУдалитьДобрый день, Den.
ОтветитьУдалитьЕсли еще актуально, то посмотри здесь: http://mydjangoblog.blogspot.com/2011/04/blog-post_29.html.
Вывод информации осуществляется практически аналогично, каждый раз. Просто нужно разобраться с переменными и указателями на поля таблыци