2016-06-28 3 views
1

레거시 앱에서는 URL이 있는지 확인하고 그렇지 않은 경우 다른 위치로 리디렉션해야합니다. 문제는 url 파일에 url이 값 집합에 있는지 확인해야하며이 작업을 가장 효과적으로 수행 할 수있는 방법이 확실하지 않다는 점입니다.슬러그가 있는지 동적으로 확인하십시오.

예를 들어, 프로젝트와 도시 모두 동일한 URL 패턴을 공유합니다. 예 : /projects/london/projects/my-project-name.

먼저 슬러그가 도시와 일치하는지 확인한 다음 프로젝트보기를 반환하지 않으면 도시가 프로젝트 이름과 일치 할 수 없습니다.

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

나는 이것이 매우 지저분 알고, 나쁜 종합 형하지만 불행히도 그것은 순간에 변경 될 수있는 일이 아니다 다음과 같이

내 URL은 현재 구성되어 있습니다. 따라서 내 목표는 project-name이 도시 일 수 있는지 먼저 확인하고 리디렉션 루프에 빠지지 않고 해당보기로 리디렉션 할 수 있는지 파악하는 것입니다. 나는 이런 식으로 뭔가 할 수 있다면

이 궁금 : london|paris|new-york 동적

답변

2

발생

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

당신은 동적 도시 이름을 모두 가진 URL을 생성 할 수 있습니다,하지만 URL은 한 번 캐시됩니다 django가 처음 액세스하기 때문에 url 정규식을 수정하려면 django 프로세스를 다시 시작해야합니다.

: 아마 자신의 적절한보기로 요청을 보낼 수있는 로직을 구현하는 뷰 라우팅 방법을 만들기 위해 더 나은 것,

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

그러나 : 그것은 당신의 목적을 위해 괜찮아요 경우,이 같은 URL을 생성 할 수 있습니다

# 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_project 또는 get_city보기 자체의 결과를 반환합니다.

이렇게하면 도시 목록을 데이터베이스 또는 파일과 동적으로 비교할 수 있습니다.

+0

감사합니다. 매우 유용합니다. 나는 잡초에 덫을 놓고 조금 빗나간 다. 그리고 내가보기/라우터에 모든 논리를 넘겨 줘야한다는 것을 놓쳤다. – djq