Загрузки файла изображения 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()

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

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

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

1
задан amarillion 27 July 2010 в 21:08
поделиться

2 ответа

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

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

  • Изображения загружаются в указанный мной каталог upload_to, относительно MEDIA_ROOT, указанного в settings.py
  • Все еще не уверен насчет этого
  • Django автоматически добавляет знаки подчеркивания к имени файла, чтобы предотвратить дублирование
  • присвоение screenshot=form.clean_data['screenshot'], как в приведенном выше коде, работает как ожидалось.
-2
ответ дан 2 September 2019 в 22:40
поделиться

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 помогли вам.

4
ответ дан 2 September 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: