Простое приложение администратора Django - Как отслеживать версии файлов - PullRequest
0 голосов
/ 21 марта 2012

Если у меня есть модель Django с FileField, например,

class Probe(models.Model):
    name =  models.CharField(max_length=200, unique=True)
    nanoz_file = models.FileField(upload_to='nanoz_file', blank=True)

, есть ли способ предотвратить перезапись загруженного файла, если пользователь загружает новый файл в интерфейсе администратора?

Также, если я сохраню старые файлы, есть ли способ связать предыдущие файлы с экземпляром модели?

То есть, я бы хотел иметь возможность перечислить все файлы, загруженные наПоле nanoz_file для данного экземпляра модели.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Django никогда не перезаписывает загруженный файл. Если вы загрузите 'foo.png' дважды, второй будет 'foo_1.png' - я только что проверил это, но не верю своему слову: попробуйте тоже!

Все, что вам нужно сделать (или позволить django-reversion сделать), это отслеживать предыдущие имена файлов.

1 голос
/ 21 марта 2012

Вы можете использовать эту структуру:

class File(models.Model):
    name = models.CharField()
    file = models.FileField(upload_to='files_storage/')
    belongs = models.ForeignKey('self')
    creation = models.DateTimeField(auto_now_add=True)

Тогда в представлении вы можете использовать что-то вроде:

def edit_file(request, ...):
    # Get the file model instance
    file_model = ... # Code to get the instance
    # Create a new instance of the model with the old file path
    old_file = File(name='file1-v2', file=file_model.file, belongs=file_model)
    old_file.save()
    # Update the file_model with the new file data

Надеюсь, это поможет!

0 голосов
/ 23 марта 2012

Как сказал jpic, вы можете попробовать django-reversion, или

  • отслеживать имена прошлых файлов в видах DB, например, в отдельной строке таблицы, в настраиваемом поле или в поле gfk.
  • Глобальные файлы в сети, пока имя файла управляется.

Для второго способа, фактически для обработки всех пользовательских загрузок, лучше называть файл по заданному вами шаблону, а не использовать необработанное имя (вы также можете сохранить необработанное имя для дальнейшего использования). Для вашего случая, поскольку поле имени уникально, оно подходит в качестве базы для создания имени файла загруженных файлов, если оно редко изменяется:

import os.path
from django.hash_compat import sha_constructor

def upload_to(self, filename):  
    return 'nanoz_file/%s%s' % (
        sha_constructor(self.name).hexdigest(), os.path.splitext(filename)[-1])

class Probe(models.Model):
    name =  models.CharField(max_length=200, unique=True)
    nanoz_file = models.FileField(upload_to=upload_to, blank=True)

Тогда, на ваш взгляд, вы можете получить список имен всех файлов экземпляра Probe probe по

import glob
# be careful to operate directory securely
glob.glob(os.path.join(
    os.path.dirname(probe.nanoz_file.path),
    '%s*' % sha_constructor(probe.name).hexdigest())) 
...