Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replacing a character in Django template

I want to change & to and in the my page's meta description.

This is what I tried

{% if '&' in dj.name %}
    {{ dj.name.replace('&', 'and') }}
{% else %}
    {{ dj.name }}
{% endif %}

This doesn't work. It still shows as &

like image 922
Unknown Coder Avatar asked Jan 31 '14 14:01

Unknown Coder


3 Answers

dj.name.replace('&', 'and') You can not invoke method with arguments.You need to write a custom filter.

Official guide is here:

https://docs.djangoproject.com/en/dev/howto/custom-template-tags/

Ok, here is my example, say, in an app named 'questions', I want to write a filter to_and which replaces '&' to 'and' in a string.

In /project_name/questions/templatetags, create a blank __init__.py, and to_and.py which goes like:

from django import template

register = template.Library()

@register.filter
def to_and(value):
    return value.replace("&","and")

In template , use:

{% load to_and %}

then you can enjoy:

{{ string|to_and }}

Note, the directory name templatetags and file name to_and.py can not be other names.

like image 55
tcpiper Avatar answered Sep 19 '22 11:09

tcpiper


More useful:

from django import template

register = template.Library()


@register.filter
def replace(value, arg):
    """
    Replacing filter
    Use `{{ "aaa"|replace:"a|b" }}`
    """
    if len(arg.split('|')) != 2:
        return value

    what, to = arg.split('|')
    return value.replace(what, to)


like image 45
mrvol Avatar answered Sep 19 '22 11:09

mrvol


The documentation says thus:

Because Django intentionally limits the amount of logic processing available in the template language, it is not possible to pass arguments to method calls accessed from within templates. Data should be calculated in views, then passed to templates for display.

You will have to edit dj.name beforehand.

Edit: looks like Pythoner knows a better way: registering a custom filter. Upvote him ;)

like image 27
2rs2ts Avatar answered Sep 20 '22 11:09

2rs2ts