Question

I am trying to display conditional text in a Pyramid Chameleon template. Basically, checking if the dictionary key 'maxed_out_alerts' is empty (false) or has a string 'yes' in it.

<p tal:condition="not:maxed_out_alerts"><h3>Maxed Out.</h3></p>
<p tal:condition="maxed_out_alerts"><h3>Not Maxed Out</h3></p>

When 'maxed_out_alerts' is an empty string, 'Maxed Out' is only displayed (correctly). However, If 'maxed_out_alerts' contains 'yes' string both 'Maxed Out' and "Not Maxed Out' are displayed (incorrectly).

It seems that the NOT is always evaluated to a true condition. It should display one or the other messages not both. What am I doing wrong? thanks

Was it helpful?

Solution

For TAL conditionals in python you can say python: and then use a python syntax conditional

<p tal:condition="python:len(maxed_out_alerts) > 0"><h3>Maxed Out.</h3></p>

OTHER TIPS

It could help if you save boolean state in a boolean variable. By storing this information in a string you run into such problems you are facing right now. That's what builtin python types are made for - use them.

As a pyramid developer I would advice to move the logic to evaluate the current value of maxed_out_alerts into a string into a view method and pass the computed string in a dictionary to the renderer/template. This way you can even create tests for the view logic - any pyramid tutorial, simple or advanced shows you how to do that.

A good start for any simple logic - imagine logic gets more complicated or you even have to translate the text for the template.

@view_config(name="yourname", renderer='templates/yourtemplate.pt')
def myview(request):
    """
    #get boolean state from model
    #could be that you want to have it the other way round
    #or do it by using python ternary operator - a if test else b 
    if model['maxed_out_alerts'] == True:
        maxed_out_alerts = 'Maxed Out'
    else:
        maxed_out_alerts = 'Not Maxed Out'


    return dict(maxed_out_alerts = maxed_out_alerts)

In your Template

<h3 tal:content="maxed_out_alerts">text for maxed out alerts</h3>

or

<h3>${maxed_out_alerts}</h3>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top