2012-02-25 4 views
9

私はバックエンドとしてDjangoを使用してWebサイトを開発しています。管理インターフェースを使用して新しいページを追加できるようにしたいので、ページタイトル、より良いURLに使用されるページエイリアス、静的コンテンツや記事ベースの構造を望むかどうかを選択します。Djangoの動的URL

私はsitemanagerというアプリケーションを作成しました。このアプリケーションは上記のページモデルとテンプレート(メニュー用など)のコンテキストにページを追加するコンテキストプロセッサーで構成されています良い。

もちろん、私はそれを私のURLファイルにフックする必要がありますが、どこに問題が起きるのですか?Pageモデルをの形式で取得し、私のURLパターンを生成できますしたがって、それは表示されますが、Djangoはそのファイルをキャッシュしているように見えます(通常は意味があります)。そのため、サーバーの再起動後に変更が行われます。これは明らかに容認できません。

新しいページが追加または削除された場合、またはエイリアスが変更された場合は管理アプリケーションにURLキャッシュをリセットしてもらいますが、キャッシュは一般的には良いことですから、どのようにそこから始めるのか。

また、現時点では私が見ていない簡単な解決策もありますか?

from sitemanager.models import Page 
static_pages = Page.objects.filter(static=True) 
article_pages = Page.objects.filter(static=False) 
for page in static_pages: 
    pattern = r'^/'+page.alias+'/$' 
    urlpatterns += patterns('', 
     url(pattern, 'views.static_page', 
      { 'active': page } 
     ) 
    ) 
# Pretty much the same for the article pages, 
# but with includes of another app 

私は私の頭の中でそのコードを除去しながら、私はあまりにも多くのミスをしなかった願っています:

urls.pyの関連部分は、基本的にはこのようになります!

答えて

13

URLにnamed groupsを使用すると、データをビューに渡すことができ、URLの動的な更新は不要です。 page.aliasを含む名前付き部分は、単にビューの関数にキーワード引数として渡されます。これを使用して実際のPageオブジェクトを取得できます。

# urls.py 
urlpatterns += patterns('', 
    (r'^(?P<page_alias>.+?)/$', 'views.static_page'), 
) 

# views.py 
def static_page(request, page_alias): # page_alias holds the part of the url 
    try: 
     active = Page.objects.get(page_alias=page_alias) 
    except Page.DoesNotExist: 
     raise Http404("Page does not exist") 
2

データベース全体のアイテムごとに特定のURLは必要ありません。

あなたのビューを見ることなく、私はあなたが1つのURL、またはおそらくいくつかのURLで逃げることができると思います。例として

#urls.py 
urlpatterns = patterns('yourapp.views', 
url(r'^static_pages/(?P<static_pages_id>\d+)/(?P<True_or_False>\D+)$', your_view_here, name='your_name_here'), 
) 

#views.py 
def your_view_here(request, static_pages_id, True_or_False): 
    obj = get_object_or_404(Page, pk=static_pages_id) 
    if True_or_False: 
     #do something when True