2011-02-04 4 views
6

У меня есть таможенный складДжанго Пользовательские системы хранения файлов

import os 
from django.core.files.storage import Storage 


class AlwaysOverwriteFileSystemStorage(Storage): 
    def get_available_name(self, name): 
     """ 
     Directly Returns a filename that's 
     from what user input. 
     """ 
     if self.exists(name): 
    # Remove the existing file 
     os.remove(name) 
    # Return the input name as output 
     return name 

Я хочу знать, где я должен поместить его файл AlwaysOverwriteFileSystemStorage.py и как следует по settings.py определить DEFAULT_FILE_STORAGE

Мой корневую папку Джанго является /главная/имя пользователя/WebApp

Когда я поставил DEFAULT_FILE_STORAGE = 'site.storage.AlwaysOverwriteFileSystemStorage', он возвращает

Ошибка

Ошибка импорта модуля хранения site.storage: "Нет модуль с именем хранения"

Я не знаком с Python/Django, любая помощь будет оценена. Спасибо.

+0

Основываясь на своем пути, кажется, что ваш проект называется «сайтом» и есть каталог внутри называется «хранение». Убедитесь, что в «хранилище» есть пустой файл __init__.py. –

+0

@AbidA \ __ init \ __. Py – amertkara

ответ

12

Вам не нужно ничего помещать в свой settings.py. Просто используйте его прямо в своей модели. Например, создайте storage.py везде, где находится ваше приложение, и положите в него OverwriteStorage(). Тогда ваша модель может выглядеть так:

from storage import OverwriteStorage 
... 
class MyModel(models.Model): 
    ... 
    image = ImageField(upload_to='images', storage=OverwriteStorage()) 

Я также использую специальную систему хранения для перезаписывания существующих файлов. Моя storage.py выглядит следующим образом:

from django.core.files.storage import FileSystemStorage 

class OverwriteStorage(FileSystemStorage): 
    """ 
    Returns same name for existing file and deletes existing file on save. 
    """                
    def _save(self, name, content): 
     if self.exists(name): 
      self.delete(name) 
     return super(OverwriteStorage, self)._save(name, content) 

    def get_available_name(self, name): 
     return name 
+0

Спасибо! очень подробный ответ –

5

Вы можете поместить его в любом месте, но вы должны указать путь к там в settings.py

Вы можете поместить этот storage.py файл в корневой папке (тот, который имеет manage.py) и указать путь как storage.AlwaysOverwriteFileSystemStorage

+1

Это должен быть правильный принятый ответ, поскольку он решает проблему, а не обходит ее. – Ishan

Смежные вопросы