如何在模板中获取ImageField的URL?

21 投票
4 回答
42896 浏览
提问于 2025-04-17 10:10

我在我的Django应用里有一个模型:

class Image(models.Model):
    image = models.ImageField(
        upload_to='images/', 
        height_field='height', 
        width_field='width'
    )
    credit = models.CharField(max_length=50, blank=True)
    caption = models.TextField(blank=True)
    article = models.ForeignKey(Article)
    width = models.PositiveIntegerField(
        blank = True, null = True,
        editable = False,
        default = 0
    )
    height = models.PositiveIntegerField(
        blank = True, null = True,
        editable = False,
        default = 0
    )

我把MEDIA_ROOT设置成了Apache网站根目录下的一个叫做/hmedia/的文件夹,并把MEDIA_URL设置成了'http://localhost/hmedia/'。这样设置似乎没问题——我通过Django的管理后台成功上传了几张图片,并且可以通过http://localhost/hmedia/images/[filename]来查看这些图片。而且,Django的管理后台确实显示了每张图片的文件名,并且链接到每张图片的实际网址,这些链接也能正常工作。

我的问题是,我不知道怎么在我的模板里获取这些图片的URL或文件名:

<ul>
{% for image in article.image_set.all %}
    <li>Caption: "{{image.caption}}", Credit: "{{image.credit}}", URL: "{{image.url}}"</li>
{% endfor %}
</ul>

上面的模板输出了这个结果:

<ul>

    <li>Caption: "here's an image caption", Credit: "some photographer", URL: ""</li>

    <li>Caption: "Another caption here", Credit: "Another photographer", URL: ""</li>

</ul>

换句话说,它正确地输出了每张图片的标题和版权信息,但对于{{image.url}}却什么都没输出。

我该如何在我的模板中获取图片的URL呢?Django的管理界面模板是怎么做到的?(我在管理模板目录里找过,但没找到我想要的东西。)

4 个回答

1

如果你在 forms.py 文件中有一个 ImageForm,并且把这个表单实例传递到你的 Django 模板里,那么使用 src="{% get_media_prefix %}{{your-form-instance.instance.image}}" 这段代码就能解决你的问题。

models.py

这是定义数据模型的地方,通常用来描述你要存储的数据结构。
class Addon(models.Model):
    image = models.FileField(upload_to='addons/', null=True)
    addon_name = models.CharField(max_length=100, null=False, blank=False)

forms.py

这里是定义表单的地方,表单用来收集用户输入的数据。
class AddonForm(forms.ModelForm):
    addon_name = forms.CharField(max_length=100, required=True)
    image = forms.ImageField(required=False)

views.py

这个文件处理用户请求和返回响应,连接模型和模板。
@require_http_methods(['GET'])
def addons(request, ):
    addon_form_set = modelformset_factory(Addon, form=AddonForm, extra=1)
    addon_forms = addon_form_set(queryset=Addon.objects.all())
    return render(request, 'addons/addons.html', {'form': addon_forms)

your_templates.html

这是你用来展示内容的网页模板,用户在这里看到最终的结果。
{% for data in form %}
   <img src="{% get_media_prefix %}{{data.instance.image}}"/>
{% endfor %}
1

把你的代码改成这样:

<ul>
{% for image in article.image_set.all %}
    <li>Caption: "{{ image.caption }}", Credit: "{{ image.credit }}", URL: "<a href ='/{{ image.image }}'{{ image.image }}</a>"</li>
{% endfor %}
</ul>

把 {{ image.url }} 改成 {{ image.image }},因为 '.image' 里包含了图片的位置。你从 '.url' 里得不到任何值的原因是,你的 Image 类里没有 url 这个字段。

51

你需要的是 {{ image.image.url }}{{ image.image.path }},而 {{ image }} 只是一个图片对象,是你定义的模型的一个实例。{{ image.image }} 则让我们访问到一个字段,这个字段是 ImageField 对象,并提供了所有指定的属性。

撰写回答