在旧版应用中,我需要检查网址是否存在,如果不存在,则将其重定向到其他位置。问题是我需要在url文件中检查一组值中是否存在该URL,并且我不清楚如何最好地执行此操作。
例如,项目和城市都共享相同的网址格式。例如/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
答案 0 :(得分:2)
您可以动态生成包含所有城市名称的网址,但是一旦django第一次访问该网址,网址就会被缓存,因此为了修改网址正则表达式,您必须重新启动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_project
或get_city
视图本身的结果。
这也允许您针对数据库或文件动态检查城市列表。