Django-根据数据库中的值显示静态文件夹中的图像

时间:2020-01-03 14:53:43

标签: django python-3.x

我有一个... ## adding a drop box OptionList= [ 'Singapore', 'London', 'Bangkok', 'Moscow' ] city_list = StringVar(window, OptionList) city_list.set('select the city') observer = city_list.trace('w', lambda *_: weather()) # ADDED. opt = tk.OptionMenu(window, city_list, *OptionList) opt.config(width = 90, font = ('Arial', 12)) opt.pack() ... 应用,该应用的模型包含城市,县和国家/地区代码:

models.py

Django

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

示例:

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

现在,我想在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 模板中显示文件夹中与数据库值相对应的每个图像。

我已经做过一些研究,我读到静态图像比从静态文件夹中导入图像要好,而不是将图像存储在数据库中是更好的选择。有什么方法可以进行映射并使用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

2 个答案:

答案 0 :(得分:1)

你快到了! 根据您的设置,您的目录结构应如下所示,

.
├── 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 %}

答案 1 :(得分:1)

由于此文件是固定的,不会经常更改,因此我认为它们应存储在static directory中。现在,如果文件夹结构是这样的:

.
├── project_root
├── static
│   ├── city_images
│      ├── LA.jpg
│      ├── NewYork.jpg
│      └── Washington.jpg
├── apps

然后您的设置应如下所示:

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]
STATIC_URL = '/static/'

然后只需使用:

{% load static %}
<div class="inner-bg overlay-dark" style="background-image:url({% static 'city_images/NewYork.jpg' %};);">

或者您可以像编辑中提到的那样与模型集成:

# model

from django.templatetags.static import static

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 static("city_images/{}".format(self.fCityCode))

# view

{% for i in areamap_objects %}
   <img src="{{ i.img_url }}" >
{% endfor %}