2012-02-25 279 views
9

我正在開發一個使用Django作爲後端的網站,我希望允許客戶使用管理界面添加新頁面 - 因此他輸入了頁面標題,用於更好的url的頁面別名,並選擇他是想要靜態內容還是基於文章的結構。Django動態網址

我的方法如下:我創建了一個名爲sitemanager的應用程序,該應用程序由上述頁面模型以及將頁面添加到我的模板上下文(用於菜單等)的上下文處理器組成,精細。

當然,我還需要將其掛接到我的網址文件,但在這裏就是麻煩開始的地方:我可以,感謝的Django的Python的結構,檢索內urls.pyPage模型,並生成我的URL模式相應地,它確實顯示,但Django似乎緩存該文件(這通常很有意義),所以更改只會在服務器重新啓動後纔會發生。這顯然是不可接受的。

我的第一個想法是以某種方式使管理應用程序重新設置url緩存,如果新頁面被添加,刪除或別名被修改(並且只有這樣,因爲緩存通常是件好事),但我沒有想法如何從那裏開始。

或者也許有一個更簡單的解決方案,我目前沒有看到?

urls.py的相關部分基本上是這樣的:

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 

我希望,而在我的腦海剝離的代碼我沒有犯太多的錯誤!

回答

13

您可以在網址中使用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。

沒有看到您的觀點,我想你可以逃脫一個網址,或可能是一些網址。

作爲一個例子:

#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