#python #html #dictionary #flask #jinja2
Вопрос:
У меня есть вложенный словарь на python:
result = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}}
Мне нужно распечатать в колбе/джинджа эти данные. Я хочу получить дерево или вложенный список. Результат должен быть:
lt;ul class="list"gt; lt;li class="title"gt; lt;a href="/"gt;"Physics"lt;/agt; lt;/ligt; lt;ul class="list2"gt; lt;li class="title2"gt; lt;a href="/"gt;"Mechanics"lt;/agt; lt;/ligt; lt;ul class="list3"gt; lt;li class="title3"gt; lt;a href="/"gt;"Kinematics "lt;/agt; lt;/ligt; lt;li class="title3"gt; lt;a href="/"gt;'Dynamics'lt;/agt; lt;/ligt; lt;/ulgt; lt;/ulgt; lt;/ulgt; lt;ul class="list"gt; lt;li class="title"gt; lt;a href="/"gt;'Math'lt;/agt; lt;/ligt; lt;ul class="list2"gt; lt;li class="title2"gt; lt;a href="/"gt;'Algebra'lt;/agt; lt;/ligt; lt;ul class="list3"gt; lt;li class="title3"gt; lt;a href="/"gt;'Polynomials'lt;/agt; lt;/ligt; lt;ul class="list4"gt; lt;li class="title4"gt; lt;a href="/"gt;'sum of polynomials'lt;/agt; lt;/ligt; lt;/ulgt; lt;/ulgt; lt;/ulgt; lt;/ulgt;
Как я должен решить свою проблему?
Ответ №1:
Вы можете использовать рекурсию для создания HTML-разметки словаря, а затем передать полученную строку в свой шаблон:
def to_html(d, c = 1): if not all(d.values()): return f'lt;ul class="list{"" if c == 1 else c}"gt;' 'n'.join(f'lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt;{"" if not b else to_html(b, c 1)}' for a, b in d.items()) 'lt;/ulgt;' return 'n'.join(f'lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt;' if not b else f""" lt;ul class="list{"" if c == 1 else c}"gt; lt;li class="title{"" if c == 1 else c}"gt;lt;a href="/"gt;{a}lt;/agt;lt;/ligt; {to_html(b, c 1)} lt;/ulgt; """ for a, b in d.items()) d = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}} print(to_html(d))
Выход:
lt;ul class="list"gt; lt;li class="title"gt; lt;a href="/"gt; Physics lt;/agt; lt;/ligt; lt;ul class="list2"gt; lt;li class="title2"gt; lt;a href="/"gt; Mechanics lt;/agt; lt;/ligt; lt;ul class="list3"gt; lt;li class="title3"gt; lt;a href="/"gt; Kinematics lt;/agt; lt;/ligt; lt;li class="title3"gt; lt;a href="/"gt; Dynamics lt;/agt; lt;/ligt; lt;/ulgt; lt;/ulgt; lt;/ulgt; lt;ul class="list"gt; lt;li class="title"gt; lt;a href="/"gt; Math lt;/agt; lt;/ligt; lt;ul class="list2"gt; lt;li class="title2"gt; lt;a href="/"gt; Algebra lt;/agt; lt;/ligt; lt;ul class="list3"gt; lt;li class="title3"gt; lt;a href="/"gt; Polynomials lt;/agt; lt;/ligt; lt;ul class="list4"gt; lt;li class="title4"gt; lt;a href="/"gt; sum of polynomials lt;/agt; lt;/ligt; lt;/ulgt; lt;/ulgt; lt;/ulgt; lt;/ulgt;
Затем, в flask
:
@app.route('/hierarchy', methods=['GET']) def hierarchy(): d = {'Physics': {'Mechanics': {'Kinematics ': {}, 'Dynamics': {}}}, 'Math': {'Algebra': {'Polynomials': {'sum of polynomials': {}}}}} return flask.render_template('show_hierarchy.html', hierarchy=to_html(d))
show_hierarchy.html
:
lt;h1gt;Hierarchylt;/h1gt; {{hierarchy}}