如何在模板中获取ImageField URL?

时间:2012-01-13 12:24:07

标签: python django

我的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 Web根目录中名为/ 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}}输出任何内容。

如何在模板中获取图片的网址? Django管理界面模板是如何做到的? (我已经在管理模板目录中扎根但无法找到我正在寻找的内容。)

4 个答案:

答案 0 :(得分:32)

您需要{{ image.image.url }}&amp; {{ image.image.path }},而{{ image }} - 只是一个Image对象

答案 1 :(得分: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中没有字段网址。

答案 2 :(得分:0)

,如果您在Forms.py中具有ImageForm并将Form Instance传递到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 %}

答案 3 :(得分:-8)

创建一个文件夹&#34; static&#34;在你的django项目中,将其添加到你的设置文件

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

如果你没有在你的设置文件中添加此行也会添加

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

现在,您可以在模板中使用

{% static  image.image.url %}