2012-09-07 14 views
5

के साथ संबंधित यूआरएल मैं Google App Engine के साथ Jinja2 का उपयोग करता हूं। मैं अपने edit.html टेम्पलेट के साथ base.html लोड करने के लिए एक सापेक्ष पथ का उपयोग करने की कोशिश कर रहा हूं।Google App Engine और Jinja2

मेरे विषय निर्देशिका संरचना इस तरह दिखता है ...

  • आवेदन जड़
    • विषयों
      • डिफ़ॉल्ट
        • व्यवस्थापक
          • edit.html
        • base.html

मैं टेम्पलेट में इस की कोशिश की है ...

{% extends "../base.html" %} 

जो इस रिटर्न ...

TemplateNotFound: ../base.html 

जब मैं वें करता हूं है ...

{% extends "base.html" %} 

मेरा संपादन.html टेम्पलेट लोड, लेकिन base.html के बिना।

मैं base.html का उपयोग कैसे करूं जो एक निर्देशिका है edit.html से वापस है?

अब कोड के लिए ...

app.yaml

application: myblog 
version: 1 
runtime: python27 
api_version: 1 
threadsafe: no 

handlers: 

- url: /admin/.* 
    script: admin.app 
    login: admin 

- url: /favicon\.ico 
    static_files: favicon.ico 
    upload: favicon\.ico 

- url: .* 
    script: static.app 

builtins: 
- remote_api: on 

libraries: 
- name: webapp2 
    version: "2.5.1" 

- name: jinja2 
    version: latest 

config.py

blog_name = 'My Blog' 
theme = 'default' 
post_path_format = '/%(year)d/%(month)02d/%(slug)s' 

admin.py

def render_template(template_name, template_vals=None, theme=None): 
    template_path = os.path.join(os.path.dirname(__file__), 
     'themes', theme or config.theme) 
    env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_path)) 
    template = env.get_template(template_name) 
    return template.render(**(template_vals or {})) 

class BlogPost(db.Model): 
    #The URL path to the blog post. Posts have a path if they are published. 
    path = db.StringProperty() 
    title = db.StringProperty(required=True, indexed=False) 
    body = db.TextProperty(required=True) 
    published = db.DateTimeProperty(auto_now_add=True) 
    updated = db.DateTimeProperty(auto_now=True) 

    def render(self): 
     template_vals = { 
      'config': config, 
      'post': self, 
     } 
     return render_template("post.html", template_vals) 


form = model_form(BlogPost, Form) 

class PostForm(form): 
    pass 

class PostHandler(webapp2.RequestHandler): 

    @webapp2.cached_property 
    def jinja2(self): 
     return jinja2.get_jinja2(app=self.app) 

    def render_to_response(
      self, template_name, template_vals=None, theme=None): 
     template_name = os.path.join("admin", template_name) 
     self.response.out.write(render_template(
      template_name, template_vals, theme)) 

    def render_form(self, form): 
     self.render_to_response("edit.html", {'form': form}) 

    def get(self): 
     self.render_form(PostForm()) 

app = webapp2.WSGIApplication([('/admin/newpost', PostHandler)], 
           debug=True) 

edit.html

{% extends "../base.html" %} 
{% block title %}Testing New Post Template{% endblock %} 
{% block body %} 
    <form method="post" action=""> 
    <table> 

<div>{{ form.title.label }}: {{ form.title(class="css_class") }}</div> 
{% if form.title.errors %} 
     <ul class="errors">{% for error in form.name.errors %}<li>{{ error }}</li>{% endfor %}</ul> 
    {% endif %} 

<div>{{ form.body.label }}: {{ form.body() }}</div> 
{% if form.body.errors %} 
     <ul class="errors">{% for error in form.body.errors %}<li>{{ error }}</li>{% endfor %}</ul> 
    {% endif %} 

    </table> 
    <input type="submit" /> 
    </form> 
{% endblock %} 

पूर्ण स्टैक ट्रेस

ERROR 2012-09-07 07:45:42,964 webapp2.py:1553] ../base.html 
Traceback (most recent call last): 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1536, in __call__ 
    rv = self.handle_exception(request, response, e) 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1530, in __call__ 
    rv = self.router.dispatch(request, response) 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1278, in default_dispatcher 
    return route.handler_adapter(request, response) 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 1102, in __call__ 
    return handler.dispatch() 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 572, in dispatch 
    return self.handle_exception(e, self.app.debug) 
    File "/home/john/google_projects/google_appengine/lib/webapp2/webapp2.py", line 570, in dispatch 
    return method(*args, **kwargs) 
    File "/home/john/google_projects/sprucepress/admin.py", line 86, in get 
    self.render_form(PostForm()) 
    File "/home/john/google_projects/sprucepress/admin.py", line 83, in render_form 
    self.render_to_response("edit.html", {'form': form}) 
    File "/home/john/google_projects/sprucepress/admin.py", line 80, in render_to_response 
    template_name, template_vals, theme)) 
    File "/home/john/google_projects/sprucepress/admin.py", line 34, in render_template 
    return template.render(**(template_vals or {})) 
    File "/home/john/google_projects/google_appengine/lib/jinja2/jinja2/environment.py", line 894, in render 
    return self.environment.handle_exception(exc_info, True) 
    File "/home/john/google_projects/sprucepress/themes/default/admin/edit.html", line 1, in top-level template code 
    {% extends "../base.html" %} 
TemplateNotFound: ../base.html 
+0

क्या होता है यदि आप '{% विस्तारित करता है" थीम/डिफ़ॉल्ट/base.html "%}'? –

+0

एक ही त्रुटि है, लेकिन साथ "TemplateNotFound: विषयों/डिफ़ॉल्ट/base.html" – jwogrady

+0

या '', अन्य {% "डिफ़ॉल्ट/base.html"% फैली} तो है कि मुझे यकीन है कि कैसे आप टेम्पलेट निर्दिष्ट कर सकते हैं नहीं कर रहा हूँ। मुझे विश्वास नहीं है कि आप 'विस्तार' के साथ सापेक्ष पथ का उपयोग कर सकते हैं, लेकिन मैं गलत हो सकता हूं। आप [webapp2_extra/jinja2] (http://webapp-improved.appspot.com/api/webapp2_extras/jinja2.html) में भी देख सकते हैं) हो सकता है कि स्रोत इस मुद्दे पर कुछ प्रकाश डाल सके। –

उत्तर

10

ठीक है, मैं यह पता लगा ....

यहाँ मैं क्या सीखा है ...

  • अपने विषयों को एक स्थिर फ़ोल्डर बनाओ। यह एक बड़ा नो-नो because on GAE static files are not available to the application है। यदि Google App Engine आपको बता रहा है कि फ़ाइल गैर पहुंच योग्य नहीं है तो यह कारण हो सकता है!

  • Jinja2 में सभी फाइलों को आप jinja2 पर्यावरण ... नहीं टेम्पलेट फ़ाइल के लिए निर्दिष्ट फ़ोल्डर में रिश्तेदार हैं! तो, मेरे मामले में ... "डिफ़ॉल्ट" थीम फ़ोल्डर मेरा जिन्जा पर्यावरण का रूट फ़ोल्डर था। ../base.html के बजाय मैं base.html करता हूं और यह काम करता है क्योंकि base.html डिफ़ॉल्ट फ़ोल्डर में है जिसे मैंने टेम्पलेट लोड करने के लिए उपयोग करने के लिए jinja2 बताया था।

  • अंत में, यदि आप चाहते हैं एक से अधिक आप can फ़ोल्डर में एक फाइल देखने के लिए jinja2।