【问题标题】:Unable to display image using django无法使用 django 显示图像
【发布时间】:2018-09-10 12:00:23
【问题描述】:

我是使用 django 的新手。在我的应用程序中,我正在上传存储到媒体文件夹的图像。现在,我正在尝试提供用于下载不起作用的图像的链接。我还尝试直接显示图像(在 html 中使用 img),这也不起作用。

我的代码如下:

urls.py

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


app_name = 'workers'

urlpatterns = [
url(r'^$', views.index, name= 'index'),
url(r'^enrollment$',views.enroll, name='enroll'),
url(r'^save_enrollment$',views.save_enrollment, name='save_enrollment'),

]

if settings.DEBUG:
urlpatterns = urlpatterns + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

forms.py

from django import forms
from django.forms import ModelForm
from .models import Worker

class Worker_enrollment(forms.ModelForm):
    name = forms.CharField(max_length=250)
    address = forms.CharField(max_length=500)
    phone_number = forms.CharField(max_length=100)
    designation = forms.CharField(max_length=1000)
    docfile = forms.FileField(label='select an image to upload')
    ssn = forms.CharField(max_length=200)

    class Meta:
        model = Worker
        fields = ['name','address','phone_number','designation','docfile','ssn']

models.py:-

from django.db import models

class Worker(models.Model):
    name = models.CharField(max_length=250)
    address = models.CharField(max_length=500)
    phone_number = models.CharField(max_length=100)
    designation = models.CharField(max_length=1000)
    docfile = models.ImageField(upload_to='documents/')
    ssn = models.CharField(max_length=200)
    def __str__(self):
        return (self.name)

views.py:-

from .models import  Worker
from .forms import Worker_enrollment
from django.shortcuts import render, get_object_or_404
from django.conf import settings

def index(request):
    workers_info = Worker.objects.all()
    context = {
    'workers':workers_info
}
return render(request, 'workers/index.html', context)

def enroll(request):
    form = Worker_enrollment(request.POST)
    if form.is_valid():
        return render(request, 'workers/enroll.html', {'form': form})
    else:
        form = Worker_enrollment()
    return render(request, 'workers/enroll.html', {'form': form})

def save_enrollment(request):
    worker_info = Worker()
    if request.method == 'POST':
        form = Worker_enrollment(request.POST,request.FILES)
        if form.is_valid():
            worker_info.name = form.cleaned_data['name']
            worker_info.address = form.cleaned_data['address']
            worker_info.designation = form.cleaned_data['designation']
            worker_info.phone_number = form.cleaned_data['phone_no']
            worker_info.ssn = form.cleaned_data['ssn']
            worker_info.docfile = request.FILES['docfile']
            worker_info.save()
            return render(request,'workers/saves_worker.html',{'worker_info':worker_info})
    else:
        form = Worker_enrollment()
    return render(request, 'workers/saves_worker.html', {'worker_info': worker_info})

enroll.html:-

<form action="save_enrollment" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_ul }}
<input type="submit" value="Submit" />
</form>

saves_worker.html:-

<h1>Worker has been enrolled</h1>
<br>
<h2>Name - {{worker_info.name}}</h2><br>
<h2>PhoneNo - {{worker_info.phone_number}}</h2><br>
<h2>Designtion - {{worker_info.designation}}</h2><br>
<h2>SSN - {{worker_info.ssn}}</h2>
<h2>Address - {{worker_info.address}}</h2>
<h2><a href="{{ worker_info.docfile.url }}" >worker's image</h2>

settings.py文件中指定了以下内容:-

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

【问题讨论】:

  • Worker_enrollment modelform 还是正常形式?
  • 如果您使用的是modelform,那么我建议让验证通过表单并让它保存数据,而不是创建Wroker 模型的对象并保存它。
  • 它是一个模型形式。我确实尝试过(即第一个答案中给出的建议)。它没有任何区别。图像存储在 media/documents 文件夹中)。单击图像链接时,它甚至会在 url 部分显示 media/documents/image_name.jpg,但图像未打开。
  • 您的模板&lt;h2&gt;&lt;a href="{{ worker_info.docfile.url }}" &gt;worker's image&lt;/h2&gt; 中有一处错字。您应该删除worker's 并使用其他类似worker image
  • 没有任何影响

标签: python django image-upload


【解决方案1】:

您确定您的 save_enrollment 函数将图像保存在 worker_info 的 docfile 字段中吗?尝试使用:

def save_enrollment(request):
    if request.method == 'POST':
        form = Worker_enrollment(request.POST,request.FILES)
        if form.is_valid():
            worker_info = form.save()
            return render(request,'workers/saves_worker.html',{'worker_info':worker_info})
    else:
        form = Worker_enrollment()
    return render(request, 'workers/saves_worker.html', {'worker_info': worker_info}

【讨论】:

  • 我查过了。 python shell 中的 worker_info.docfile 给出 。图像被保存在 Media/documents 文件夹中。您的代码也给出了相同的结果。在 save_worker.html 我添加了以下 if 语句:- {% if worker_info.docfile %} 它返回 true。
  • 所以在验证表单后您没有在 save_enrollment 函数中获取 docfile,但在模板中进行检查返回 true?您的请求是否包含任何文件?
  • 模板中的校验返回true。我没有得到问题的第二部分。你能澄清一下吗?
  • request.FILES 是否携带任何文件?试试 print(request.FILES), print(worker_info.docfile) 告诉我。
  • 它返回
【解决方案2】:

您不需要在模型表单中再次定义字段。此外,您在表单中使用FileField 而不是ImageField。如果要在表单中添加额外的字段,则需要在__init__() 表单方法中添加这些字段。 尝试以下方法:

class Worker_enrollment(forms.ModelForm):

    class Meta:
        model = Worker
        fields = ['name','address','phone_number','designation','docfile','ssn']

额外提示:不要将CharFieldmax_length=1000 一起使用。 CharField 最多可使用 255 个字符。如果您需要更多长度,请改用TextField。您还需要安装Pillow 库才能使图像可见。

【讨论】:

  • 我进行了更改。图像保存在媒体/文档中,但在 shell 中键入以下命令: a=Worker(pk=1) a.docfile 我得到 图像未显示
  • 你的数据库中只有一个对象吗?您是否尝试使用其他主键?
  • 是的,我做到了。未找到:/media/documents/passport_size_photograph_OhflV19.jpg 以上显示在控制台中,但 jpg 文件在 media/documents 中
  • 我还查看了项目的源代码。

  • 可以显示图片,但还是不明白为什么会返回
【解决方案3】:

我刚刚通过如下更改 MEDIA_URL 解决了我的问题:

MEDIA_URL = 'shield/media/'

我的项目名称是 shield。

【讨论】:

    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2020-07-30
    • 2020-03-03
    • 2023-04-01
    相关资源
    最近更新 更多