Я просто не могу выяснить, как загрузить изображения в 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, но та страница не объясняет:
Это кажется, что те проблемы были уже решены тысячу раз...
В итоге оказалось, что мой код был правильным, но версия Django была неправильной. После обновления до Django 1.2.1 (с 1.0.2) мой код заработал без изменений.
Чтобы ответить на собственные вопросы
screenshot=form.clean_data['screenshot']
, как в приведенном выше коде, работает как ожидалось. 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 помогли вам.