2011-01-16 6 views
5

私はデータベースオブジェクトに格納された名前に基づいて、DjangoでURLを動的に作成するように心がけました。これらのページはすべて同じビューで処理する必要がありますが、呼び出されたときにデータベースオブジェクトをビューにパラメータとして渡したいと思います。それは可能ですか?ここでDjango:URLにデータを含めることなく、URLディスパッチャから表示するデータを渡しますか?

は、私が現在持っているコードは次のとおりです。

places = models.Place.objects.all() 
for place in places: 
    name = place.name.lower() 
    urlpatterns += patterns('', 
     url(r'^'+name +'/$', 'misc.views.home', name='places.'+name) 
    ) 

はURLへのより多くのパラメータを追加することなく、ビューに追加情報を渡すことが可能ですか? URLはルートディレクトリ用で、他の値を表示するには404ページが必要なので、文字列パラメータを使用することはできません。 URLにルートを追加しようとすることをあきらめて解決策はありますか、それとも別の解決策がありますか?

すべてのURLは一意でなければならないので、名前自体を参照することができます。それが唯一の選択肢ですか?

答えて

18

これは一般に、そのモデルに関連するリクエストだけでなく、すべてのリクエストに対してデータベースにクエリを行うため、悪い考えです。より良いアイデアは、一般的なURLの構成を考え出し、それらのすべてに対して同じビューを使用することです。ビュー内の関連する場所を取得することができます。このビューは、特定のビューに到達したときにデータベースにのみ表示されます。例えば

urlpatterns += patterns('', 
    url(r'^places/(?P<name>\w+)/$', 'misc.views.home', name='places.view_place') 
) 

# views.py 
def home(request, name): 
    place = models.Place.objects.get(name__iexact=name) 
    # Do more stuff here 

私は、これはあなたが本当にを求めたものではありません実現していますが、はるかに少ない頭痛を提供する必要があります。

+0

あなたは良い点を挙げています。ありがとう! –

18

私はあなたがこのように、additional attributesでビューに辞書を渡すことができると思います。

url(r'^'+name +'/$', 'misc.views.home', {'place' : place}, name='places.'+name) 

そして、あなたは、このパラメータを期待するビューを変更することができます。

+0

それは私が求めていたものです。それがどういうことか分かりませんでした。 @Cideは、リクエストごとにデータベースクエリを要求するという良い点があるので、私は彼の答えについていくつもりです。ありがとう! –

+0

問題ありません、あなたが解決策を見つけてうれしいです:) –

関連する問題