【问题标题】:How to display images in Django?如何在 Django 中显示图像?
【发布时间】:2020-10-17 21:32:54
【问题描述】:

我有一个库存系统。当我单击一种药物时,它会显示该特定药物的信息。这个页面是medicine_details.html。当我打开时,我得到了所有正确的信息,但我看不到图像。当我在检查中打开页面时出现错误:

<img src=(unknown) alt="img">

我该如何解决?

views.py

def medicine_detail(request, id):
    medicine = get_object_or_404(Medicine, id=id)
    context = {
        'medicine': medicine,
    }
    return render(request, 'medicine_details.html', context)

models.py

class Medicine(models.Model):

    medicine_name = models.CharField(max_length=100)
    medicine_info = RichTextField(verbose_name="notes")
    medicine_code = models.CharField(max_length=100)
    medicine_qr = models.CharField(max_length=100)
    medicine_price = models.IntegerField()
    medicine_stock = models.IntegerField()
    medicine_image = models.ImageField(upload_to='images', null=True, blank=True)
    slug = models.SlugField(max_length=100, unique=True, editable=False)

    def get_image(self):
        if self.medicine_image and hasattr(self.medicine_image, 'url'):
            return self.medicine_image.url
        else:
            return

    def __str__(self):
        return self.medicine_name

    class Meta:
        ordering = ['medicine_name']

    def get_create_url(self):
        return reverse('medicines:medicine_create', kwargs={'slug': self.slug})

    def get_unique_slug(self):
        slug = slugify(self.slug.replace('ı', 'i'))
        unique_slug = slug
        counter = 1
        while Medicine.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, counter)
            counter += 1
        return unique_slug

    def get_absolute_url(self):
        return reverse('medicines:medicine_create', kwargs={'slug': self.slug})

    def save(self, *args, **kwargs):
        self.slug = self.get_unique_slug()
        return super(Medicine, self).save(*args, **kwargs)

medicine_details.html

<div class="panel panel-primary">
                <div class="panel-heading text-center"><h3>{{medicine.medicine_name}} </h3></div>
                    <div class="panel-body">


                        <h4><p class="text-success">Medicine Name:  <small>{{medicine.medicine_name}}</small></h4>
                        <h4><p class="text-success">Details:  <small>{{medicine.medicine_info}}</small></h4>
                        <h4><p class="text-success">Barcode:  <small>{{medicine.medicine_code}}</small></h4>
                        <h4><p class="text-success">QR:  <small>{{medicine.medicine_qr}}</small></h4>
                        <h4><p class="text-success">Price:  <small>{{medicine.medicine_price}} TL</small></h4>
                        <h4><p class="text-success"> <small></small></h4>
                        <img src="{{ medicine.medicine_image.url }}" alt="img">

settings.py

...

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

urls.py ...

url(r'^medicines/(?P<id>\d+)/$', medicine_detail, name="detail"),


    ]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我使用 MySQL 进行数据库管理。

【问题讨论】:

    标签: python html django


    【解决方案1】:

    试试这样:

    {% if medicine.medicine_image %}
    <img src="{{STATIC_URL}} {{ medicine.medicine_image.url }}" alt="img">
    {% endif %}
    

    在你的设置文件中你应该有:

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

    如果这不起作用,请发布您遇到的错误。

    【讨论】:

    • 它不起作用,但它显示了 ALT 文本,并且左边有一个破碎的图片图标
    • 你的页面顶部有{% load static % }吗?
    • 是的。例如,当我从管理面板添加图像时,我从该页面退出并再次打开图像消失,就像我从未添加过一样。
    • 我在 urls.py 中写错了一些东西,我修复了它并编辑了我的问题,当我从管理面板添加图像时,我得到一个错误:预期的 str、字节或 os.PathLike 对象,而不是元组跨度>
    • 确保您的 BASE_DIR 后面没有逗号。您必须在某处有一个额外的逗号,因为它会将某些东西作为一个不应该是一个的元组来选择。
    【解决方案2】:

    {{ medicine.medicine_image.url }} 替换为

    /media/{{ medicine.medicine_image.url }}

    【讨论】:

      【解决方案3】:

      在您的设置中,设置:

      MEDIA_URL = '/media/'
      

      确保django.template.context_processors.mediaTEMPLATEScontext_processors 选项中

      # settings
      TEMPLATES = [
          {
              "BACKEND": "django.template.backends.django.DjangoTemplates",
               ...
              "OPTIONS": {
                  ...
                  "context_processors": [
                      ...
                      "django.template.context_processors.media",
                  ],
              },
          }
      ]
      

      然后在您的模板中,您可以使用:

      <img src="{{MEDIA_URL}}{{medicine.medicine_image}}" alt="img">
      

      注意:{{MEDIA_URL}}之后没有反斜杠

      【讨论】:

      • @eda 你改过图片名了吗,b'img_medicine/apranax_3ISERzD.jpg' 是bytes 不是str
      • 我将药物名称更改为 0.jpg,但出现错误:[28/Jun/2020 22:11:17] "GET /medicines/6/ HTTP/1.1" 200 2950 Not Found: / media/b'img_medicine/0_Ga1GI77.jpg'
      • 您似乎以某种方式破坏了正常的存储行为,文件路径永远不应是bytes对象,如果是bytes对象,则无法首先保存图像。
      • 我使用 mysql 数据库,并且我制作的医学图像是 blob。好不好?
      • 虽然使用文件系统进行存储更容易,也更可取
      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2015-06-04
      • 2016-03-18
      • 2020-07-19
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多