Как загрузить и отобразить изображение с помощью формы модели в Django? - PullRequest
0 голосов
/ 20 марта 2020

Я пытался загрузить и отобразить изображение, но оно не показывает изображение.

В models.py

class upload(models.Model):
    Comments = models.CharField(max_length=200)
    img = models.ImageField(upload_to='images/',blank=True) 

forms.py

class upl(ModelForm):
   class Meta:
      model= upload
      fields= ['Comments','img']

views.py

def home(request):  
   form=upl()
   if request.method=='POST':
       form = upl(request.POST, request.FILES)
       if form.is_valid():
           Comments = form.cleaned_data['Comments']
           img = form.cleaned_data['img']
           p=upload(Comments=Comments,img=img)
           p.save()
   return render(request,'home.html',{'form':form,'up':upload.objects.all(), })

в шаблоне

<form method="POST">
{% csrf_token %}
{{form.as_p}}
<br>
 <BUTTON TYPE ="SUBMIT">Submit</BUTTON><br>
<br>
</form>

{%for i in up %}
{{i.Comments}}
<img src ="{{i.img}}", alt="">
{%endfor%}

Так что это показывает комментарии, но не изображение. Я не знаю, почему изображение не отображается.

1 Ответ

0 голосов
/ 21 марта 2020

OK. Здесь происходит несколько вещей.

models.py и forms.p y в порядке.

Представления .py должен выглядеть следующим образом. Я закомментировал ваш код и добавил одну строку. По сути, я думаю, что здесь происходит не то, что вы создаете экземпляр 'загрузки' и сохранения модели, это только сохраняет поле 'Комментарии' и не обрабатывает файл. Выполнение метода .save () для объекта формы решает эту проблему.

def imagetest(request):  
   form=upl()
   if request.method=='POST':

       form = upl(request.POST, request.FILES)
       if form.is_valid():
            form.save()
#           Comments = form.cleaned_data['Comments']
#           img = form.cleaned_data['img']
#           p=upload(Comments=Comments,img=img)
#           p.save()

   return render(request,'home.html',{'form':form,'up':upload.objects.all(), })

Теперь перейдем к отображению изображений. Во-первых, вам нужно будет изменить настройки для распознавания файлов мультимедиа. Измените файл settings.py , чтобы определить значения для местоположения файла мультимедиа и презентации.

Добавьте эти строки внизу.

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'mediafiles')  

Конечно, вы можете выбрать любое место для этих файлов. См. Эту ссылку для дополнительной информации о MEDIA_URL и MEDIA_ ROOT

. Для views.py необходимо внести 2 изменения.

Добавить enctype = "multipart / form-data" для оператора формы. Это необходимо для того, чтобы объект File был отправлен вместе с POST.

Замените {{i.img}} на {{i.img.url}}. При добавлении метода .url выдается правильный относительный URL для изображение (простыми словами, предварительно добавляет значение Media Root.

<form enctype="multipart/form-data" method="POST">
{% csrf_token %}
{{form.as_p}}
<br>
 <BUTTON TYPE ="SUBMIT">Submit</BUTTON><br>
<br>
</form>

{%for i in up %}
{{i.Comments}}
<img src ="{{i.img.url}}", alt="">
{%endfor%}

Предполагая, что вы запускаете его с использованием внутреннего сервера разработки, вам необходимо внести следующие изменения в ваши URL-адреса .py .

Добавьте эти записи в начало файла.

from django.conf import settings
from django.conf.urls.static import static

Добавьте шаблон, чтобы сервер мог найти файлы изображений. ... + stati c (settings.MEDIA_URL, document_root = settings.MEDIA_ ROOT)

urlpatterns = [
    path('', views.home, name="home"),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Надеюсь, это поможет. Рад сделать продолжение в случае необходимости.

...