2014-12-30 91 views
0

我的所有用户都可以选择链接配置文件图片。有几个模板需要加载此配置文件图片。如果用户没有上传图片,我们使用默认值。当我想显示此资料图片,我的代码看起来像这样解析服务器上的静态URL

<img src="{% if user.profile_picture.search_thumbnail.url %}{{ user.profile_picture.search_thumbnail.url }}{% else %}{% static "alternate.jpg" %}{% endif %}"> 

这是办法,我太冗长,特别是考虑到我需要重复它在多个模板。我可以使用{%with%}块来存储user.profile_picture.search_thumbnail.url,但这对我来说无能为力。

我的解决方案是编写一个附加到用户模型的函数,该函数返回静态文件的url。不幸的是,{%static%}是一个模板函数。 {%url%}在服务器上有一个名为django.core.urlresolvers.reverse()的等效函数。 {%static%}标记是否存在替代方法?

如果有人问,我想使用静态函数,因为我的静态文件根据环境存储在不同的地方。我的开发机器在本地提供文件,而我的PRD机器从s3提供静态文件。

谢谢 尼克

+1

''settings.STATIC_URL''? –

+0

这是一个非常合理的建议 – Nick

回答

1

为什么不写一个过滤器,你可以做到这一点。

<img src="{{ user.profile_picture.search_thumbnail.url|custom_filter }}">

,并在您从settings.STATIC_URL读返回正确的网址,用户一个未设置custom_filter。

你可以使过滤器更短这样

<img src="{{ user|user_pic_url }}">

,并在过滤器中拔出.profile_picture.search_thumbnail.url /检查

+0

使用过滤器有没有什么优点/缺点,而只是向我的用户模型中添加一个方法,以便为我返回url? – Nick

+0

没有我能想到的;除非你需要传递额外的论据,否则我认为两者都可以很好地工作。 –

+0

听起来对我很好。谢谢 – Nick

0

这是static templatetag做什么的下方,你可以在你自己的代码中使用它:

from django.contrib.staticfiles.storage import staticfiles_storage 

def static(path): 
    return staticfiles_storage.url(path)