views:

387

answers:

4

I'm using the webapp framework from google for this. I'm using template.render() in a get method to render a template for me.

I'm using the following code to do this for me

path = os.path.join(os.path.dirname(__file__), file_name)
self.response.out.write(template.render(path, template_values))

Where file_name is the template to render and template_values is a dict() containing any values to be rendered. What if I don't have any values that I want rendered. Do I just pass in an empty dict() object? It doesn't seem like a great solution to me. Should I be using template.load() instead?

(I can't find the docs for the template class over on google app engine either, hence I'm asking.)

+1  A: 

Since you are rendering a Django template, you need to use render, and you probably can't provide an empty dictionary, as it will complain about not being able to find the variables it expects, unless you enclose each variable reference in an {% if %} block. You should provide a dictionary with all of the keys that the template expects but with empty strings as values.

Adam Crossland
I don't think I'm explaining this properly, although static files do sound like what I want to do.Basically I have a template foo.html that contain a form. When the form is posted to I want to process the inputs and re-render the page (foo.html) based on those inputs. But when the use just navigates to the form I don't want to render any values into the form. If I just serve the static html file it contains all my {{ }} template tags, I don't want to have to replicate the html file either.
Phil
Phil, what you are describing requires that you use template.render with an empty template_values dictionary.
Adam Crossland
@Adam That's currently what I'm doing (as per my original post).I'm asking is there a better solution than that.
Phil
I don't believe that there is.
Adam Crossland
What I have done for now is put the rendering code into its own method that takes the template file name and the template values as arguments. I've defaulted template_values to =dict() but this is essentially the same solution.I'll need to go back to the drawing board and work out a static solution.
Phil
@adam - its okay with an empty dictionary too, just FYI.
Phil
+2  A: 

You can pass an empty dictionary to it and it doesn't mind. You just have to send it something. Your templates just won't display anything.

template_values = {}

path = os.path.join(os.path.dirname(__file__), file_name)
self.response.out.write(template.render(path, template_values))
mcotton
+1  A: 

If you have no template variables to pass in, just pass an empty dictionary. If you do use any variables in the template, they will all evaluate as None.

To make this easier, you could modify your helper code:

def render_template(template_name, template_values = None):
  if template_values is None:
    template_values = {}
  path = os.path.join(os.path.dirname(__file__), template_name)
  self.response.out.write(template.render(path, template_values))
Nick Johnson
+1  A: 

Okay, thanks for all the answers.

What I've done is:

def render_template(template_name, template_values=dict()):
   path = os.path.join(os.path.dirname(__file__), template_name)
   self.response.out.write(template.render(path, template_values))

Which seems to be the most pythonic solution I could come up with.

Phil