2016-06-28 66 views
1

在傳統應用程序上,我需要檢查URL是否存在,如果不存在,請將其重定向到其他位置。問題是,我需要檢查該URL是否存在於一組值中,在urls文件中,我不清楚如何最好地做到這一點。動態檢查是否存在slu 012

例如,項目和城市都共享相同的網址格式。例如/projects/london/projects/my-project-name

我想先檢查slug是否與城市相匹配,如果它不能返回項目視圖(城市不能匹配項目名稱)。

我的網址是目前的結構如下:

url(r'^projects/(?P<project-name>[-\w]+)', get_project, name='project-view'), 
url(r'^projects/.*', get_city, name='city-view'), 

我知道這是很凌亂,和一個壞的整體格局,但不幸的是它不是東西,可以在瞬間不會改變。所以我的目標是弄清楚我是否可以首先檢查project-name是否可以成爲一個城市,如果是,則重定向到該視圖而不會陷入重定向循環。

我想,如果我可以做這樣的事情:

url(r'^projects/(?P<city>london|paris|new-york)/', get_city, name='city-view'), 

其中london|paris|new-york動態

回答

2

產生可以動態地生成所有的城市名稱的網址,但該網址將被一次緩存django第一次訪問它,所以爲了修改url正則表達式,你必須重新啓動django進程。如果這是罰款的目的,您可以產生這樣的網址:

url(r'^projects/(?P<city>{})/$'.format(city_slugs.join('|')), 
    get_city, name='city-view') 

但是,它可能會更好地創建一個實現將請求發送到適當的視圖的邏輯視圖路由方法:

# urls.py 
# ... 
url(r'^projects/(?P<slug>[-\w]+)/$', 
    project_city_router, name='project-city-router'), 
# ... 

# views.py 
def is_a_city(slug): 
    # If they're in the database, something like: 
    # return City.objects.filter(slug=slug).exists() 
    return slug in ['london', 'paris', 'new-york', '...'] 

def project_city_router(request, slug=None): 
    if not slug: 
     # /projects/ 
     return render(request, 'my/template.html', {'foo': 'bar'}) 
    elif is_a_city(slug): 
     # /projects/<city>/ 
     return get_city(request, city=slug) 
    else: 
     # /projects/<project-name/ 
     return get_project(request, project_name=slug) 

使用此路由器,如果參數slug是項目或城市,則返回視圖本身的結果get_projectget_city

這也允許您根據數據庫或文件動態檢查城市列表。

+0

謝謝 - 非常有幫助。我有一點被困在雜草中,錯過了我應該將所有邏輯交給視圖/路由器 – djq