2012-01-21 9 views
1

django-adminはどのようにモデルをURLから解決しますか?djangoの管理者はどのようにモデルをURLから解決しますか?

私は同じことをどのように行うことができます。この "/管理/動画/アイテム/"

のようなURLになりますか?そのURLからモデルを取得してください...

'/ admin/vide/item'を取得し、ビデオアプリケーションでItemオブジェクトを返す関数を実装する必要があります。

更新:

は、私は簡単にvideo.models.Itemに「管理/動画/アイテム」を回すが、最初の後にモデル名では大文字であるかどうかわからないイム以上の大文字のlatersがあることができます。

ドキュメントは言う:

view, args, kwargs = urlresolvers.resolve('/admin/video/item/') 
enter code hereview(*args,**kwargs) 

ので、私は、ビューの権利を持っていますか?次の質問はどのように私はそのビューからモデルを取得するのですか?

答えて

3

管理者のURLは、アプリのラベルとモデル名で構成されています。

django.db.models.get_modelを使用すると、これら2つの文字列からモデルクラスを取得できます。私はこれに似た質問を投稿

# urls.py 
url(r'^(?P<app_label>[\w\-]+)/(?P<model_name>[\w\-]+)/$', DynamicListView.as_view(), name='list'), 


# views.py  
class DynamicListView(LoginRequiredMixin, ListView): 
     template_name = 'dynamic_list.html' 

     @property 
     def model(self): 
     return apps.get_model(app_label=str(self.kwargs['app_label']), model_name=str(self.kwargs['model_name'])) 

     @property 
     def app_label(self): 
     return str(self.kwargs['app_label']) 

     def get_queryset(self): 
     queryset = super(DynamicListView, self).get_queryset() 
     return queryset.filter(**self.request.GET.dict()) 

     def dispatch(self, request, *args, **kwargs): 
     if request.user.is_superuser: 
      return super(DynamicListView, self).dispatch(request, *args, **kwargs) 

     else: 
      # Set permissions here for non-staff users 

# urls 
(r'^admin/(?P<app_label>\w+)/(?P<model_name>\w+)/$', my_view), 

# view 
from django.db.models import get_model 

def my_view(request, app_label, model_name): 
    model_class = get_model(app_label, model_name) 
    return http.HttpResponse(model_class.objects.all()) 
0

ファイルアプリケーション構造が管理者に登録されていますか。つまり、モデルを登録すると、索引付けされる最初の要素はアプリケーション名で、2番目の要素はmodels.pyで定義されたモデル名です。これは、video/models.pyに定義されているアイテムクラスを検索することを意味します。

設定ファイルでは、プロジェクトの絶対パスをインポートし、必要なモデルをrequest.pathで分割して動的にインポートすることができます。最後に... idで項目を取得します分割された文字列の最後の項目。

+0

その汚れ。モデル名に複数の大文字が含まれている場合、私には役に立ちません。 – Pol

+0

あなたはまったく正しいです – Davsket

関連する問題