понедельник, 11 апреля 2011 г.

Загрузка текстового файла с помошью динамического upload_to



Итак приступим).

Здесь я опушу как создавал модели и как просто (на мой взгляд) задавать динамический путь для 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) можно вставлять любые условя для определения пути, по которому файл сохраниться

4 комментария:

  1. Привет. Я вот тоже только пару дней как с django :) А не мог бы ты по подробнее описать view.py я пока не совсем с эти разобрался.
    Спасибо.

    ОтветитьУдалить
  2. С удовольствием. Только просьба подписываться, чтобы я мог к тебе нормально обращаться).
    Итак, С моделями я думаю все понятно. там главное - эьто поле с 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)

    ОтветитьУдалить
  3. Привет еще раз. Все со все разобрался. Появился новый вопрос, на счет ForeignKey, не могу понять как отобразить все это в templete. Когда модель отображаю все отлично, но вот Key отображается выпадающим списком :(

    ОтветитьУдалить
  4. Добрый день, Den.
    Если еще актуально, то посмотри здесь: http://mydjangoblog.blogspot.com/2011/04/blog-post_29.html.
    Вывод информации осуществляется практически аналогично, каждый раз. Просто нужно разобраться с переменными и указателями на поля таблыци

    ОтветитьУдалить