Nick
Nick

Reputation: 1268

Resolve Static URL on Server

All of my user's have the option to link a profile picture. There are several templates that need to load this profile picture. If the user has not uploaded a picture, we use a default. When I want to display this profile picture, my code looks like this

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

This is way too verbose for me, especially considering I need to repeat it out in multiple templates. I could use {% with %} blocks to store user.profile_picture.search_thumbnail.url, but that won't help me too much.

My solution was to write a function attached to the user model that returns the url of the static file. Unfortunately, the {% static %} is a template function. {% url %} has an equivalent function on the server called django.core.urlresolvers.reverse(). Does the alternative thing exist for the {% static %} tag?

In case anyone asks, I want to use the static function because my static files are stored in different places depending on the environment. My dev machine serves files locally, while my PRD machine serves static files from s3.

Thank you, Nick

Upvotes: 0

Views: 259

Answers (2)

Risadinha
Risadinha

Reputation: 16666

This is what the static templatetag does underneath, and you can use it just fine in your own code:

from django.contrib.staticfiles.storage import staticfiles_storage

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

Upvotes: 0

warath-coder
warath-coder

Reputation: 2122

why not write a filter so you can do this.

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

and in the custom_filter you read from the settings.STATIC_URL to return the correct URL the user one is not set.

you could make the filter even shorter like this

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

and in the filter pull out the .profile_picture.search_thumbnail.url /checks

Upvotes: 1

Related Questions