ИСПОЛЬЗУЙТЕ динамическую папку назначения для загруженного файла в Django - PullRequest
1 голос
/ 20 декабря 2009

Я хотел бы динамически создавать место назначения своих загруженных файлов. Но, похоже, опция upload_to доступна только для моделей, а не для форм. Так что следующий код неверен.

класс MyForm (формы. Form):

     fichier = forms.FileField(**upload_to='files/%m-%Y/'**)

В представлении, обрабатывающем загруженный файл, назначение является статическим. Как я могу сделать его динамичным?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 21 декабря 2009
class YourFileModel(models.Model)
    def upload_path(self, name):
        name = do_sth_with_name(name)
        folder = generate_folder_name(self.id, self.whatever_field)
        return 'uploads/' + folder + '/' + name

    file = models.FileField(upload_to=upload_path)

редактировать после комментария

def handle_uploaded_file(file):
    # generate dynamic path
    # save file to that path

пример здесь http://docs.djangoproject.com/en/dev/topics/http/file-uploads/#handling-uploaded-files

если форма из модели, переопределить метод save ()

class YourForm(forms.ModelForm):
    fichier = forms.FileField()
    def save(self):
        if self.cleaned_data['fichier']:
            file = handle_uploaded_file(self.cleaned_data['fichier'])
        super(YourForm, self).save()

если не из модели, вызовите обработчик загрузки по вашему мнению

def your_view(request):
    #####
    if form.is_valid():
        file = handle_uploaded_file(form.cleaned_data['fichier'])
2 голосов
/ 20 декабря 2009

Вместо строки укажите вызываемый объект, то есть имя функции, которая принимает экземпляр модели и строку и возвращает желаемое имя. См. FileField docs для подробностей. Единственное, что они не говорят (по крайней мере, я не могу найти его в документации), это то, что если возвращаемое имя файла начинается с '/', то это абсолютный путь, в противном случае он относится к вашему каталогу / media.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...