更改网址和视图之间的变量

时间:2011-07-08 08:11:13

标签: django django-views django-urls

在url调度程序捕获变量并将其传递给视图后,是否可以更改变量?

例如: 我有以下urlpattern

urlpatterns = patterns('',
    (r'^articles/(?P<article_id>\d+)/$', 'article.views.article_view'),
)

我想在将article_id传递给article.views.article_view

之前更改article

我需要这个,作为覆盖。我有{{1}}个应用程序无法更改,但我必须使用它。 : - /

2 个答案:

答案 0 :(得分:3)

使用包装器视图。将URL映射到您自己的视图,然后调用article.views.article_view。然后,您可以在包装器视图中更改所需的任何内容。

示例:

urlpatterns = patterns('',
    (r'^articles/(?P<article_id>\d+)/$', 'article_wrapper.wrap_article_view'),
)

article_wrapper.py

import article
def wrap_article_view(request, article_id):
    article_id = modify_it(article_id)
    return article.views.article_view(request, article_id)

更新

如果您需要为多个视图执行相同的article_id转换,则可以使包装器更通用。例如:

urlpatterns = patterns('',
    url(r'^articles/(?P<article_id>\d+)/$', 
        view='article_wrapper.generic_article_wrapper',
        kwargs={'view_name':'article_view'}
    ),
)

article_wrapper.py

import article
def generic_article_wrapper(request, article_id, view_name=None):
    article_id = modify_it(article_id)
    try:
        view = get_attr(article.views, view_name)
    except AttributeError:
        # handle invalid view name
    return view(request, article_id)

答案 1 :(得分:2)

from article.views import article_view

def my_article_view(request, article_id):
    my_id = article_id * 2 # modify your id
    return article_view(request, my_id)