1

私はCakeのバックグラウンドを持っており、Djangoを学び始めたばかりです。私はそれがかなり好きですが、ケーキのように設定より規約を使用したいと思います。それで、

  1. CakeスタイルのURLを自動的に取得するにはどうすればよいですか?たとえば、私がそこに行った場合、mysite.com/posts/view/5ロードしmysite.posts.views.viewて引数5を渡しますか?urls.pyのようなものを追加できると思って(r'^(.*)/(.*)', 'mysite.$1.$2'),いましたが、もちろんそれは機能しません。

  2. テンプレートを自動的にロードするにはどうすればよいですか?各ビュー関数は、のようなテンプレートを自動的にロードする必要がありますtemplates/posts/view.html

これも可能ですか、それともDjangoのコアをハックする必要がありますか?


カールが提案したことに基づいた私の解決策は次のとおりです。

urlpatterns = patterns('',
    # url pats here
    url(r'^(?P<app>\w+)/(?P<view>\w+)/(?P<args>.*)$', 'urls.dispatch')
)

def dispatch(req, app, view, args): # FIXME: ignores decorators on view func!
    func = get_callable(app+'.views.'+view)
    if args:
        ret = func(req, *args.split('/'))
    else:
        ret = func(req)
    if type(ret) is dict:
        return render_to_response(app+'/'+view+'.html', ret)
    else:
        return ret

初期テストではかなりうまく機能しているようです。1つの関数で両方の問題を解決します。おそらくGETスタイルの引数をサポートしません。

4

2 に答える 2

4

これらのポイントはどちらも、Django コアをハッキングしなくても実装できますが、どちらも高度な Python 技術にかなり精通している必要があります。

次のようなパターンで一般的な URL パターンを実行できます。

url(r'^(?P<appname>\w+)/(?P<viewfunc>\w+)/(?P<args>.*)$', 'myresolverfunc')

次に、「appname」、「viewfunc」、および「args」パラメーターを受け取る「myresolverfunc」「ビュー」関数を定義し、必要なロジックを実装し、「/」で引数を分割し、参照されているビュー関数に動的にインポートおよびディスパッチします。 . 最も厄介な部分は動的インポートです。Django のソースで「importlib」を検索して、内部のさまざまな場所で動的インポートがどのように行われているかを確認できます。

自動テンプレート ローダーは、さまざまな"render_to" デコレーターと同様のビュー関数デコレーターとして実装できますが、テンプレート名をデコレーターに渡すのではなく生成する点が異なります。その名前を取得するには、関数オブジェクトをイントロスペクトする必要があります。アプリ名を取得するのはよりトリッキーになります。おそらく、各 views.py ファイルでモジュールレベルのグローバルとしてハードコーディングするか、上記の URL ディスパッチャーと連携して、アプリ名などでリクエストオブジェクトに注釈を付けたいと思うでしょう。

于 2009-11-05T03:04:22.410 に答える
1

このためにDjangoのコアをハックする必要はありません。一般的なビューが必要なようです。GenericViewsトピックガイドも確認してください。

一般的なビューのドキュメントに記載されている最初の例は、最初の箇条書きのように聞こえます。

例:

次のURLパターンがあるとします。

urlpatterns = patterns('django.views.generic.simple',
    (r'^foo/$',             'direct_to_template', {'template':'foo_index.html'}),
    (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template':'foo_detail.html'}),
)

... / foo /へのリクエストはテンプレートfoo_index.htmlをレンダリングし、/ foo /15/へのリクエストはコンテキスト変数{{params.id}}が15に設定されたfoo_detail.htmlをレンダリングします。

于 2009-11-05T00:42:11.137 に答える