如何在模板中获取ImageField的URL?
我在我的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 个回答
如果你在 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 %}
把你的代码改成这样:
<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 这个字段。
你需要的是 {{ image.image.url }}
和 {{ image.image.path }}
,而 {{ image }}
只是一个图片对象,是你定义的模型的一个实例。{{ image.image }}
则让我们访问到一个字段,这个字段是 ImageField
对象,并提供了所有指定的属性。