首页 > 解决方案 > Django - 根据数据库中的值显示静态文件夹中的图像

问题描述

我有一个Django应用程序,它的模型包含城市、县和国家代码:

模型.py

class AreaMap(models.Model):
    Code = models.AutoField(primary_key=True)
    fCityCode = models.CharField(
        verbose_name='City', max_length=100)
    fCountyCode = models.CharField(
        verbose_name='County', max_length=100)
    fCountryCode = models.CharField(
        verbose_name='Country', max_length=100)

    def __str__(self):
        return self.fCityCode

对于每个城市,我的静态文件夹中都有一些不会更改的静态图像(或者至少,如果需要,旧文件将被新文件覆盖但保持相同的文件名)。图像和数据库中的值之间的对应关系是通过字段“fCityCode”:

例子:

对于纽约- 在数据库中保存为“NewYork”,并且我的静态文件夹中的图像文件名相同,“NewYork”。

现在,我想在我的HTML模板中显示文件夹中与数据库中的值相对应的每个图像。

我已经做了一些研究,我读到当涉及到静态图像时,最好从静态文件夹中导入它们,而不是将图像存储在有意义的数据库中。有没有办法做这个映射并使用它来实现这个Django?谢谢

稍后编辑

所以,我的settings.py样子如下:

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

我的urls.py样子如下:

urlpatterns = [
        #other urls
]

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

上面的模型已经根据foo-bar答案进行了修改并添加了@property构造函数:

class AreaMap(models.Model):
    Code = models.AutoField(primary_key=True)
    fCityCode = models.CharField(
        verbose_name='City', max_length=100)
    fCountyCode = models.CharField(
        verbose_name='County', max_length=100)
    fCountryCode = models.CharField(
        verbose_name='Country', max_length=100, default='RO')

    @property
    def img_url(self):
        return "{}{}".format(settings.MEDIA_URL, self.fCityCode)

使用浏览器中的检查选项,这就是URL照片的样子,但不知何故它没有显示在浏览器中:

<a href="/path/" class="card img-card fh-400 border-0 outer-bg" data-background-inner="/media/NewYork.jpg">
<div class="inner-bg overlay-dark" style="background-image:url(&quot;/media/NewYork.jpg&quot;);">
</div>

标签: djangopython-3.x

解决方案


你快到了!根据你的设置,你的目录结构应该是这样的,

.
├── project_root
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
├── media
│   └── foo
└── myapp_name
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    ├── migrations
    │   ├── 0001_initial.py
    │   └── __init__.py
    ├── models.py
    ├── templates
    │   └── sample.html
    ├── urls.py
    └── views.py

关键是media目录应该放在根目录下

要在模板中渲染图像,您需要AreaMap通过视图将查询集传递给模板。

#myapp_name/views.py
from django.shortcuts import render


def sample_view(request):
    return render(request, 'sample.html', context={'qs': AreaMap.objects.all()})

现在将模板中的 Queryset 迭代(或您想在模板中执行的任何操作)为,

#myapp_name/templates/sample.html

{% for item in qs %}
    <p><img src="{{ item.img_url }}" width="300px"></p>
{% endfor %}

推荐阅读