我有一个表是postgres数据库,该表的列名称为castimage
,数据类型为bytea
。我通过查询将图像插入到列中(它显示[二进制数据])。
当我尝试在HTML页面中显示图像时,它不显示。
是否可以在页面上显示图像?还是应该更改用于存储图像的字段数据类型?
views.py
def search(request):
FormSearchMovies1=FormSearchMovies()
image=Tblcast.objects.get()
return render(request,"search.html",{'FormSearchMovies1':FormSearchMovies1,'image': image})
models.py
class Tblcast(models.Model):
castid = models.AutoField(primary_key=True)
castname = models.CharField(max_length=100)
castimage = models.BinaryField()
HTML
<img src="{{image.castimage.url}}" alt="CastImage" class="img-fluid">
您可以将图像转换为二进制数据,并将其存储在postgresql中,以将其用于src转换为base64。或者,您可以存储图像URL并传递给图像src。
我建议您使用ImageField代替BinaryFields,除非出于某些原因您没有选择。当您将图像(或任何类型的文件)存储在数据库中时,数据库大小会快速增长,某些托管服务提供商会设置数据库大小的限制。另外,操作较慢,因为如果可以使用html渲染图像,则必须将图像转换为base64。
同样,我的建议是使用ImageField并将图像存储在服务器存储,CDN或其他位置,而不是直接存储在DB中。如果您不能这样做,请尝试将二进制代码转换为base64:
import base64 img_bi = Tblcast.objects.get(pk=1).castimage encoded_img = base64.b64encode(img_bi) # pass encoded_img to the template into a context var
您需要向该代码添加错误检查;)
<img src="data:image/jpeg;base64,{{ encoded_img }}" alt="my_img">
如果无法将字段更改为ImageField,请重新考虑使用base64而不是二进制字段来存储图像,因此您不必在每次提供图像时都对图像进行编码。