Ich baue ein grundlegendes CMS in Flask für ein iPhone orientierte Website und ich bin mit ein wenig Mühe mit etwas. Ich habe eine sehr kleine Datenbank mit nur 1 Tabelle (Seiten). Hier ist das Modell:
class Page(db.Model):
__tablename__ = 'pages'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
parent_id = db.Column(db.Integer, db.ForeignKey("pages.id"), nullable=True)
Wie Sie sehen können, verweisen die Unterseiten einfach auf ein anderes Seitenobjekt in der parent_id
Bereich. Was ich versuche, in der Admin-Bedienfeld zu tun ist eine verschachtelte ungeordnete Liste mit allen Seiten in ihren übergeordneten Seiten verschachtelt haben. Ich habe sehr wenig Ahnung, wie man das macht. Alles, was ich denken kann, ist die folgende (die nur funktionieren wird (vielleicht-ich habe es nicht getestet) 2 Ebenen nach unten):
pages = Page.query.filter_by(parent_id=None)
for page in pages:
if Page.query.filter_by(parent_id=page.id):
page.sub_pages = Page.query.filter_by(parent_id=page.id)
Ich würde sie dann einfach als Liste in der Vorlage formatieren. Wie würde ich diese Arbeit mit potenziell über 10 verschachtelte Seiten machen?
Vielen Dank im Voraus!
EDIT: Ich habe mich ein wenig umgesehen und Folgendes gefunden http://www.sqlalchemy.org/docs/orm/relationships.html#adjacency-list-relationships also habe ich hinzugefügt
children = db.relationship("Page", backref=db.backref("parent", remote_side=id))
auf den Grund meines Page
Modell. und ich bin auf rekursiv gehen durch alles und fügen Sie es zu einem Baum von Objekten. Ich habe wahrscheinlich keinen Sinn gemacht, aber das ist der beste Weg, wie ich es beschreiben kann
EDIT 2: Ich hatte einen Versuch, eine rekursive Funktion zu machen, um durch alle Seiten zu laufen und ein großes verschachteltes Wörterbuch mit allen Seiten und ihre Kinder zu generieren, aber es hält Python abstürzen, so dass ich denke, es ist nur eine Endlosschleife ... hier ist die Funktion
def get_tree(base_page, dest_dict):
dest_dict = { 'title': base_page.title, 'content': base_page.content }
children = base_page.children
if children:
dest_dict['children'] = {}
for child in children:
get_tree(base_page, dest_dict)
else:
return
und die Seite, mit der ich es teste:
@app.route('/test/')
def test():
pages = Page.query.filter_by(parent_id=None)
pages_dict = {}
for page in pages:
get_tree(page, pages_dict)
return str(pages_dict)
Hat jemand eine Idee?