2010-07-27 5 views
1

Я просто не могу понять, как загрузить изображения в django. Я читал десятки сообщений в блогах и вопросы здесь, но большинство из них просто путают меня больше.Загрузка файла изображения Django

Вот что у меня есть. Это моя модель:

class Post(models.Model): 
    user = models.ForeignKey(User) 
    screenshot = models.ImageField(null=True, upload_to="images") 
    date = models.DateTimeField("date posted", auto_now=True) 
    text = models.TextField() 

Вот форма, которую я использую:

class PostForm(forms.Form): 
    text = forms.CharField(
     widget = forms.Textarea(attrs = {'cols': 40, 'rows': 10}), required=True) 
    screenshot = forms.ImageField(required=False) 

А вот как я в настоящее время обработки формы:

if request.method == 'POST': 
    form = PostForm(request.POST, request.FILES) 
    if form.is_valid(): 
     post = Post(
     user = request.user, 
    text=form.cleaned_data['text'], 
    screenshot=form.cleaned_data['screenshot'] 
    ) 
     post.save() 

Но это не работает , файл не загружается на сервер. Согласно documentation on file uploads, я должен написать свою собственную функцию handle_uploaded_file, но эта страница не объясняет:

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

Это, кажется, как эти проблемы уже решены в тысячу раз ...

ответ

-2

В конце концов, мой код был прав, но моя версия Django была неправильной. После того как я обновился до Django 1.2.1 (из 1.0.2), мой код работал без изменений.

Чтобы ответить на мои вопросы

  • Изображения получают загружены в upload_to реж я указал, относительно MEDIA_ROOT указанного в settings.py
  • До сих пор не уверен, что это один
  • Django автоматически добавляет подчеркивание имени файла для предотвращения дублирования
  • присвоение screenshot=form.cleaned_data['screenshot'] как в коде выше работает как ожидалось.
+0

stevejalim ответил на вопрос лучше, чем вы. –

+0

Ну, его ответ действительно не работал для меня вообще. – amarillion

4

1) Ваш ImageField нужен upload_to путь:

forms.ImageField(required=False, upload_to="/relative/path/to/foo/bar")

Обратите внимание, что, IIRC, это относительно вашего MEDIA_ROOT

2) Для распространения их по каталогам просто установите upload_to=my_path_naming_method и сделайте

def my_path_naming_method(instance, filename): 
    #something here that returns a new/bespoke string path for each file or similar 

3) Если два файла имеет одинаковое имя, Django дает новый оный _ суффикса. например, foo.jpg и «foo_.jpg», поэтому никогда не было столкновений имен

4) Я не понимаю, что вы имеете в виду, но, надеюсь, у вас есть 1-3.

+1

Нет, это не так. Когда я устанавливаю upload_to для форм.ImageField, я получаю следующую ошибку: «__init __() получил неожиданный аргумент ключевого слова 'upload_to'" – amarillion

+1

Упс - моя опечатка: должны быть models.ImageField –

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