2

Reader's Digest バージョン: 各モデルに一致するように URLconf をハードコーディングせずに、モデルの名前の URL 引数を取得して、モデルからデータ (指定されている場合は単一行または完全なテーブル) を取得するにはどうすればよいですか? 詳細については、次を参照してください。

私は 3 つのモデルを持つアプリを作成しています。モデルの名前を取得し、モデルのデフォルト マネージャーを吐き出しModel.manager.all(),、スラッグがある場合はそのスラッグに一致する単一のオブジェクトを吐き出す単純なビューを作成したいと考えています。これを行う方法がわからないため、各モデルのビュー/URLconf を個別に作成する必要があるという問題が発生しています。

URLconf は次のようになります。

(r'^model1/$', 'model1_index_view', 'model1_index'),
(r'^model1/(?P<slug>[-\w]+)/$', 'model1_detail_view', 'model1_detail'),
(r'^model2/$', 'model2_index_view', 'model2_index'),

少し長くなりますが、イメージはつかめると思います。モデル名を引数として取り、オプションでスラッグを取る 1 つのビューで実行できると考えていることを行うために、比較的大量の URLconf をハードコーディングすることになります。私の懸念は、誰かが言うモデル名を指定するとどうなるかということです... ユーザー? アプリからモデルのリストを取得し、それが contrib.auth または別のアプリのモデルではなく、それらのいずれかと一致することを確認するコードのスニペットはありますか?

4

1 に答える 1

8

get_model を使用します。

from django.db.models import get_model

def my_view(request, model_name, item_slug):
    try:
        model = get_model('app_name', model_name)
    except:
        ## throw an error
        pass
    objects = model.objects.get(slug=item_slug)

次に、URL で:

 (r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'),
于 2009-12-17T20:36:28.907 に答える