Ein Frage die ich mich schon lange Frage...
Wie kann man mit jinja rekursive Daten darstellen, wie z.B. eine Sitemap in Baumansicht??? (Wie z.B. http://pylucid.org/index.py/SiteMap/ )
[jinja] rekursiv Daten (Sitemap)
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
So:
Und hier der context:
Code: Alles auswählen
<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
<li><a href="{{ item.href }}">{{ item.title|escape }}</a>{%
if item.subtitems %}<ul>{% recurse item.subtitems %}</ul>{% endif %}
{% endfor %}
</ul>
Code: Alles auswählen
sitemap = [
{'href': '', 'title': 'blub', 'subitems': [
{'href': 'asdfsadf', 'title': 'sadfsadfd'},
{'href': 'asdfasdff', 'title': 'sasdfasdfsadffd'}
]},
{'href': 'asdasdfasdfadf', 'title': 'sasdfasdfasdfsadfdffd'}
]
TUFKAB – the user formerly known as blackbird
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich denke es heißt rekursiere, also von Rekursion.jens hat geschrieben:Aha! "recurse" ??? Was heißt das?
Alternativ kann es auch "wiederfluchen" heißen, "curse" von fluchen und "re" von etwas wiederholt tun
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Weil wir es zwar implementiert haben, aber noch nicht sicher waren ob wir es wirklich so verwenden wollen. Mittlerweile isses aber fix, mit dem nächsten release wirds dokumentiert.jens hat geschrieben:Aha! "recurse" ??? Was heißt das? Oder meinst du reuse?
In der Docu konnte ich darüber nicht's finden...
TUFKAB – the user formerly known as blackbird
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Also ich hab es nun mal Probiert, aber es will nicht so ganz...
Mein context:
Das Template:
Der Fehler:
Wo könnte der Fehler liegen???
Mein context:
Code: Alles auswählen
{'sitemap': [{'deep': 0,
'href': u'/Index/',
'id': 1L,
'name': u'index',
'subitems': [{'deep': 1,
'href': u'/Index/PhpBBadmin/',
'id': 9L,
'name': u'phpBBadmin',
'title': u'phpBBadmin'}],
'title': u'index'},
{'deep': 0,
'href': u'/ExamplePages/',
'id': 2L,
'name': u'example pages',
'subitems': [{'deep': 1,
'href': u'/ExamplePages/TinyTextileExample/',
'id': 3L,
'name': u'tinyTextile example',
'title': u'complete tinyTextile Formating examples'},
{'deep': 1,
'href': u'/ExamplePages/Testpage/',
'id': 6L,
'name': u'testpage',
'title': u'a testpage ;)'},
{'deep': 1,
'href': u'/ExamplePages/SourceCode/',
'id': 7L,
'name': u'SourceCode',
'title': u'SourceCode'},
{'deep': 1,
'href': u'/ExamplePages/Contact/',
'id': 5L,
'name': u'contact',
'title': u'contact'},
{'deep': 1,
'href': u'/ExamplePages/SiteMap/',
'id': 4L,
'name': u'SiteMap',
'title': u'SiteMap'}],
'title': u'example pages'},
{'deep': 0,
'href': u'/Test/',
'id': 8L,
'name': u'test',
'title': u'test'}]}
Code: Alles auswählen
<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
<li>
<a href="{{ item.href }}">{{ item.title|escape }}</a>
{% if item.subtitems %}<ul>{% recurse item.subtitems %}</ul>{% endif %}
{% endfor %}
</ul>
Code: Alles auswählen
Traceback (most recent call last):
...
File "W:\testing_Server\PyLucid07branch\jinja\tags.py", line 153, in __init__
self._body_loop, self._body_else = parser.forkparse('elsefor', 'endfor')
File "W:\testing_Server\PyLucid07branch\jinja\base.py", line 224, in forkparse
result_one = self.parse([shift, endtag])
File "W:\testing_Server\PyLucid07branch\jinja\base.py", line 194, in parse
nodelist.append(self.library.parse(self, 'print %s' % token.contents))
File "W:\testing_Server\PyLucid07branch\jinja\lib.py", line 64, in parse
parser.finish()
File "W:\testing_Server\PyLucid07branch\jinja\tagparser.py", line 362, in finish
self._process_feed()
File "W:\testing_Server\PyLucid07branch\jinja\tagparser.py", line 544, in _process_feed
raise RuntimeError('Expected one of %s, found %s' %
RuntimeError: Expected one of [((<function do_cut at 0x00B58C30>, None), <KeywordNode: 'cut'>), ((<function do_autolinktrunc at 0x00B587B0>, None), <KeywordNode: 'autolinktrunc'>), ((<function do_join at 0x00B58470>, None), <KeywordNode: 'join'>), ((<function do_int at 0x00B58F30>, None), <KeywordNode: 'int'>), ((<function do_str at 0x00B58EF0>, None), <KeywordNode: 'str'>), ((<function do_striphtml at 0x00B585B0>, None), <KeywordNode: 'striphtml'>), ((<function do_escapexml at 0x00B58270>, None), <KeywordNode: 'escapexml'>), ((<function do_strip at 0x00B58DF0>, None), <KeywordNode: 'strip'>), ((<function do_addslashes at 0x00B582F0>, None), <KeywordNode: 'addslashes'>), ((<function do_filesizeformat at 0x00B58CF0>, None), <KeywordNode: 'filesizeformat'>), ((<function alias::do_escapexml at 0x00B5A070>, None), <KeywordNode: 'e'>), ((<function do_rst at 0x00B58BF0>, None), <KeywordNode: 'rst'>), ((<function do_decode at 0x00B58EB0>, None), <KeywordNode: 'decode'>), ((<function do_capitalize at 0x00B58370>, None), <KeywordNode: 'capitalize'>), ((<function do_nl2pbr at 0x00B58630>, None), <KeywordNode: 'nl2pbr'>), ((<function do_sort at 0x00B58830>, None), <KeywordNode: 'sort'>), ((<function do_regexreplace at 0x00B58E70>, None), <KeywordNode: 'regexreplace'>), ((<function do_truncate at 0x00B589F0>, None), <KeywordNode: 'truncate'>), ((<function do_cleanup at 0x00B58CB0>, None), <KeywordNode: 'cleanup'>), ((<function do_upper at 0x00B58170>, None), <KeywordNode: 'upper'>), ((<function do_default at 0x00B58430>, None), <KeywordNode: 'default'>), ((<function do_format at 0x00B588F0>, None), <KeywordNode: 'format'>), ((<function do_bool at 0x00B58FB0>, None), <KeywordNode: 'bool'>), ((<function do_autolink at 0x00B58730>, None), <KeywordNode: 'autolink'>), ((<function do_reverse at 0x00B587F0>, None), <KeywordNode: 'reverse'>), ((<function do_float at 0x00B58F70>, None), <KeywordNode: 'float'>), ((<function do_textile at 0x00B58AF0>, None), <KeywordNode: 'textile'>), ((<function do_wordwrap at 0x00B58A70>, None), <KeywordNode: 'wordwrap'>), ((<function do_urlencode at 0x00B58530>, None), <KeywordNode: 'urlencode'>), ((<function do_deletedouble at 0x00B588B0>, None), <KeywordNode: 'deletedouble'>), ((<function do_wordcount at 0x00B58D70>, None), <KeywordNode: 'wordcount'>), ((<function do_makebool at 0x00B5A030>, None), <KeywordNode: 'makebool'>), ((<function do_slice at 0x00B58870>, None), <KeywordNode: 'slice'>), ((<function do_title at 0x00B583F0>, None), <KeywordNode: 'title'>), ((<function do_nl2br at 0x00B586B0>, None), <KeywordNode: 'nl2br'>), ((<function do_markdown at 0x00B58B70>, None), <KeywordNode: 'markdown'>), ((<function do_replace at 0x00B580F0>, None), <KeywordNode: 'replace'>), ((<function do_lower at 0x00B581F0>, None), <KeywordNode: 'lower'>), ((<function do_count at 0x00B584B0>, None), <KeywordNode: 'count'>), ((<function do_indent at 0x00B58970>, None), <KeywordNode: 'indent'>)], found <NameVal: u'escape'>
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Jep, mit |e geht's... Warum geht's nicht mit |escape ???beewee hat geschrieben:probier vieleicht mal statt "|escape" "|e" zu verwenden
Wobei das erzeugte Sitemap leider nicht richtig ist. Ich sehe nur die erste Ebene... Nix von "recurse"...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ich hab mal einen bug geschrieben: http://trac.pocoo.org/ticket/46jens hat geschrieben:Wobei das erzeugte Sitemap leider nicht richtig ist. Ich sehe nur die erste Ebene... Nix von "recurse"...
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Und es geht doch und es war mein Fehler, denn subtitems!=subitems
Hier der testcode:
Hier der testcode:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from jinja import Template, Context, StringLoader
context = {'sitemap': [{'href': u'/Index/',
'subitems': [{'href': u'/Index/PhpBBadmin/',
'title': u'phpBBadmin'}],
'title': u'index'},
{'href': u'/ExamplePages/',
'subitems': [{'href': u'/ExamplePages/TinyTextileExample/',
'title': u'complete tinyTextile Formating examples'},
{'href': u'/ExamplePages/Testpage/',
'title': u'a testpage ;)'},
{'href': u'/ExamplePages/SourceCode/',
'title': u'SourceCode'},
{'href': u'/ExamplePages/Contact/',
'title': u'contact'},
{'href': u'/ExamplePages/SiteMap/',
'title': u'SiteMap'}],
'title': u'example pages'},
{'href': u'/Test/', 'title': u'test'}]}
template = """
<h1>Sitemap</h1>
<ul>
{% for item in sitemap %}
<li>
<a href="{{ item.href }}">{{ item.title|escapexml }}</a>
{% if item.subitems %}
<ul>{% recurse item.subitems %}</ul>
{% endif %}
</li>
{% endfor %}
</ul>
"""
t = Template(template, StringLoader())
c = Context(context)
print t.render(c)
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Naja, ich hab vergessen |escapexml zu schreiben, wie es eigentlicht richtig ist
Dumm ist jedenfalls das die Fehlermeldung nicht so toll ist... Zumindest ist es ungewöhnlich das man so eine lange Fehlermeldung bekommt. Außerdem wäre ich nicht auf die Idee gekommen, auf den letzten Teil der Fehlermeldung zu achten
Aber naja, ich denke das liegt am "komplexen" Context...
Dumm ist jedenfalls das die Fehlermeldung nicht so toll ist... Zumindest ist es ungewöhnlich das man so eine lange Fehlermeldung bekommt. Außerdem wäre ich nicht auf die Idee gekommen, auf den letzten Teil der Fehlermeldung zu achten
Aber naja, ich denke das liegt am "komplexen" Context...