Загрузка изображения не сохраняет файл в Django

#python #django

#python #django

Вопрос:

Нет ошибок при нажатии кнопки загрузить. Но изображение не отображается там, где я указал, что оно должно. Укажите абсолютный путь в MEDIA_ROOT и укажите на него ссылку в (upload_to) параметре ImageField. Не уверен, чего мне не хватает.

Модель:

 class FileUploadHandler(models.Model):
    title = models.CharField(max_length=100)
    file = models.ImageField(upload_to='/Python27/Lib/site-packages/django/bin/mideastinfo/wiki/static/')
  

Вид:

 from models import Article, Edit
from forms import ArticleForm, EditForm
from forms import *
from PIL import Image
from models import FileUploadHandler

def image_upload(request):
    if request.method == 'POST':
        form = UploadImageForm(request.POST, request.FILES)
        if form.is_valid():
            FileUploadHandler(request.FILES['image'])
            return render_to_response('wiki/gallery.html')
    else:
        form = UploadImageForm()
    return render_to_response('wiki/gallery.html', RequestContext(request, {'form': form}))
  

Forms.py:

 class UploadImageForm(forms.ModelForm):
    class Meta:
    model = FileUploadHandler
    #image = forms.ImageField()
    fields = ['title']
  

Комментарии:

1. Разрешено ли пользователю, использующему Django, записывать в /Python27/Lib/ ?

2. Это хороший вопрос. Я являюсь пользователем и в основном работаю по этому пути в качестве своей среды разработки

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

Ответ №1:

Я думаю, вы работаете слишком усердно. Вам не нужно напрямую вызывать модель FileUploadHandler для сохранения изображения.

Во-первых, ваша форма должна быть:

 class UploadImageForm(forms.ModelForm):
    class Meta:
        model = FileUploadHandler
  

И ваше представление должно быть:

 from forms import UploadImageForm

def image_upload(request):
    form = UploadImageForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        form.save()
    return render_to_response('wiki/gallery.html', RequestContext(request, {'form': form}))
  

Поскольку вы используете ModelForm, вам просто нужно сохранить форму после ее проверки. Просто убедитесь, что поле file отображается в вашем шаблоне. Ранее вы исключали поле «файл» в своей форме, поэтому оно не работало.

Обновление: упростило ваш просмотр еще больше только потому, что…

Ответ №2:

Здесь вы не сохранили его в представлениях. Просто используйте это:

  if request.method == 'POST':
    form = UploadImageForm(request.POST, request.FILES)
    if form.is_valid():
        newfile = FileUploadHandler(title='anything', file=request.FILES['image'])
        newfile.save()
  

Комментарии:

1. Это не сработало. Ранее я пытался добавить form.save в свой существующий код, и я получаю ошибку AttributeError. Данные привязаны к форме, верно? Так почему бы не form.save?

2. На самом деле, если вы используете forms.Form (в forms.py ) вы получите эту ошибку. Если вы используете forms.ModelForm вместо этого, form.save будет работать.

3. В модели? Я использую модели. Модель.

4. Я имел в виду этот класс UploadImageForm() в forms.py

5. хм, внес изменения. Ошибки нет, но и сохранения тоже нет. Собираюсь добавить forms.py к вышеперечисленным

Ответ №3:

Решением может быть шаблон:

 <form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    <input type="submit" name="submit" value="Submit" />
</form>
  

УВЕДОМЛЕНИЕ: enctype="multipart/form-data"