【问题标题】:Django: cannot render uploaded image in templateDjango:无法在模板中呈现上传的图像
【发布时间】:2019-04-06 07:38:11
【问题描述】:

我创建了一个模型,它可以在我的模型中使用 FileField() 接受任何类型的文件。

我已经正确上传了一些文件并将引用保存在数据库中,正如我在管理界面和文件夹“媒体”中看到的那样。

但是,无法在模板中呈现此图像。我需要渲染它,以便我的用户能够将它们下载到他们的计算机上。

这些是我的图像的路径:

media/imagenes/468x60.jpg #relative path

/home/ogonzales/Escritorio/web_proyects/gallito/media/imagenes/468x60.jpg #full path

项目结构

gallito (Django project folder)
   |_gallito
   |_main_app
             |_static
             |_templates
                        |_main_app
                                  |_pedidos.html

   |_media
          |_imagenes
                    |_468x60.jpg
                    |_728x90.jpg
   |_templates
                |_registration
                              |_login.html
                |_base.html

models.py

class TamaniosCantidades(models.Model):
    TAMANIOS = (('2x2', '2" x 2"',), ('3x3', '3" x 3"',),
               ('4x4', '4" x 4"',), ('5x5', '5" x 5"',))

    CANTIDADES = (('50', '50',), ('100', '100',),
                ('150', '150',))


    tamanios = models.CharField(max_length=10, choices=TAMANIOS)
    cantidades = models.CharField(max_length=10, choices=CANTIDADES)
    imagenes = models.FileField(upload_to='imagenes/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

forms.py:

class TamaniosCantidadesForm(forms.ModelForm):
    tamanios = forms.ChoiceField(choices=TAMANIOS, widget=forms.RadioSelect(), label='Selecciona un tamaño')
    cantidades = forms.ChoiceField(choices=CANTIDADES, widget=forms.RadioSelect(), label='Selecciona la cantidad')
    class Meta:
        model = TamaniosCantidades
        # fields = ['tamanios', 'cantidades',]
        fields = ['tamanios', 'cantidades', 'imagenes']

views.py:

def pedidos(request):
    pedidos = TamaniosCantidades.objects.all()
    return render(request, 'main_app/pedidos.html', {'pedidos': pedidos})

urls.py:

urlpatterns = [
    path('', views.index),
    path('productos/', views.productos),
    path('productos/die-cut-stickers', views.die_cut, name='die-cut-stickers'),
    path('post_url/', views.post_treasure, name='post_treasure'),
    path('post_url_tamanioscantidades/', views.post_tamanioscantidades, name='post_tamanioscantidades'),
    path('pedidos/', views.pedidos),
    # path('login/', views.login_view, name='login'),
    # path('logout/', views.logout, {'next_page': settings.LOGOUT_REDIRECT_URL}, name='logout'),
]

HTML:

<div>

        <p>Mi Imagen</p>
        <img src="/home/ogonzales/Escritorio/web_proyects/gallito/media/imagenes/468x60.jpg">


         {% for pedido in pedidos %}

            <p> {{ pedido.imagenes }}</p>
            <img src="{{ pedido.imagenes.url }}" alt="Smiley">

         {% endfor %}

</div>

更新 1:

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

更新 2:

这是渲染的html

<p> imagenes/728x90.jpg</p>
<img src="/media/imagenes/728x90.jpg" alt="Smiley">



<p> imagenes/468x60.jpg</p>
<img src="/media/imagenes/468x60.jpg" alt="Smiley">

【问题讨论】:

  • 您是否在 settings.py 上设置了 STATIC_DIR 变量?
  • @AvinashRaj 请看我的更新 1,这就是我与 STATIC 相关的全部内容
  • 在浏览器中查看源代码时看到了什么?
  • @Selcuk 请看我的更新 2。

标签: python django


【解决方案1】:

如果您还没有这样做,请尝试在您的 URLs.py 中添加以下 sn-p:

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

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

这应该使您的媒体在开发过程中能够在您的浏览器中工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2013-10-31
    • 2018-09-03
    • 2016-12-06
    • 2016-09-18
    • 1970-01-01
    • 2018-11-09
    • 2020-12-13
    相关资源
    最近更新 更多