Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calling a def as a function in a Mako template

I'd like to use a def as a function, and call it from an if block:

<%def name="check(foo)">
    % if len(foo.things) == 0:
        return False
    % else:
        % for thing in foo.things:
            % if thing.status == 'active':
                return True
            % endif
        % endfor
    % endif
    return False
</%def>

% if check(c.foo):
    # render some content
% else:
    # render some other content
% endif

Needless to say, this syntax does not work. I don't want to just do an expression substitution (and just render the output of the def) as the logic is consistent, but the content rendered differs from place to place.

Is there a way to do this?

Edit: Enclosing the logic in the def in <% %> seems to be the way to go.

like image 844
Hollister Avatar asked Jan 21 '23 16:01

Hollister


2 Answers

Just define the whole function in plain Python:

<%!
def check(foo):
    return not foo
%>
%if check([]):
    works
%endif

Or you could just define the function in Python and pass it to the context.

like image 63
Jochen Ritzel Avatar answered Jan 30 '23 21:01

Jochen Ritzel


Yes, using plain Python syntax in the def works:

<%def name="check(foo)">
  <%
    if len(foo.things) == 0:
        return False
    else:
        for thing in foo.things:
            if thing.status == 'active':
                return True

    return False
  %>
</%def>

If anyone knows a better way, I'd love to hear it.

like image 43
Hollister Avatar answered Jan 30 '23 20:01

Hollister