0

ピラミッドを開始したばかりで、ビューの読み込みに問題があります。ここで私のPHPソリューションのように、データベースからフェッチされた変数に基づいてビューをロードしたい: htaccessでurlを書き換える

これを実行できるスクリプトを作成しましたが、これは正しい方法ではないと確信しています。これを実際のサイトで使用すると、非常に複雑で面倒になると思います。誰かがこれを適切に説明するか、他の解決策を教えてもらえますか?

私の現在のスクリプト:

config.add_route('home', '/')
config.add_route('admin_home', '/admin')
config.add_route('admin_pages', '/admin/pages')
config.add_static_view(name='static', path='website:static')

config.add_route('view_loader', '/*url')

ビュー.py

class ViewLoader(object):
    def __init__(self, request):
        self.request = request

    @view_config(route_name="view_loader", renderer="templates/view_loader.pt")
    def view_loader(self):
        request = self.request
        url = "/%s" % request.matchdict["url"]
        page = DBSession.query(Pages).filter_by(url=url).one()
        return dict(title=page.title, include=page.template)

view_loader.pt

<!DOCTYPE html>
<html>
<body>
    <metal:main use-macro="load: ${include}"></metal:main>
</body>
</html>

システムのアイデア:

管理者は、ランダムな URL を持つ cms でページを作成でき、テンプレートを選択する必要があります。システムはこれらのページを生成する必要があります。

  • url = /random/random -> db でテンプレートを探す -> render template_1
  • url = /random2/random2 -> db でテンプレートを探す -> render template_2

クラス/メソッドが呼び出された後にテンプレートをレンダリングして、どのテンプレートをレンダリングする必要があるかを判断したい

4

1 に答える 1

0

この質問Map different URLs to same viewの助けを借りて、私の問題に対するより論理的なアプローチを見つけました。実際、解決策は非常に単純です。 add_view() でレンダラーを宣言できることを知りませんでした。

main.py

pages = DBSession.query(Pages)
for page in pages:
    config.add_route(str(page.name), page.url)
    if page.template.decode('utf-8') == "home_view":
        config.add_view(home_view, route_name=str(page.name), renderer='templates/home.pt')        
    elif page.template.decode('utf-8') == "detail_view":
        config.add_view(home_view, route_name=str(page.name), renderer='templates/detail.pt')    

ビュー.py

def home_view(self, request):
    return dict(.....)
于 2013-10-11T17:34:47.050 に答える