2012-02-25 244 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