django - 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("/media/NewYork.jpg");">
</div>
解决方案
你快到了!根据你的设置,你的目录结构应该是这样的,
.
├── 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 %}
推荐阅读
- spring-boot - 使用 Spring Boot 时使用 JaCoCo 代码覆盖率构建 Gradle 多项目失败
- python - 在 python 和 Matlab 之间通过 TCP 套接字传输数据
- javascript - 如何将 jQuery 函数(监视 css 类)转换为 Vue 3 中的可用代码?
- swift - SwiftUI 视图转换匹配分段选择器
- python - 打印熊猫数据框时如何在行之间添加下划线分隔符?
- reactjs - 如何渲染属性位于嵌套对象数组中的元素数组?
- vuejs2 - 启动服务器后,我在 vuejs 中遇到以下问题
- spring-boot - 如何传递lookuptype!在 java 中使用 GraphQLTemplate 时枚举
- firebase - 直接来自 Firebase 存储的 Steam 音频文件
- c# - 在 C# 中从类中打印一个数组