Django URL.py高级用法。如何在url.py?

时间:2016-05-01 21:36:07

标签: django url

我们的网站有一个主要实体 - 城市。首先,用户从dropDownList中选择一个城市(网站将其存储在会话中),然后通过/ CITY / APP_NAME使用该网站的应用程序,例如。 www.mysite.com ** /基辅/ **请愿/添加。

我想从网址上抓住一个城市slu and并将其存储到会话中。要做到这一点,我有url.py如下:

    url(r'(?P<townslug>[a-z]+)/',include(urls_modules)),

和url_modules.py

    urlpatterns = [
    url(r'^$', views.index, name="index"),
    url(r'^edata/', include('edata.urls', namespace="edata")),
    url(r'^crowdfunding/', include('crowdfunding.urls')),
    url(r'^petitions/', include('petitions.urls', namespace="petitions")),
    url(r'^budget/', views.budget, name="budget"),
    url(r'^partners', views.partners),
]

我的问题是 - 如何缓存城市slu and并直接从url_modules.py将其放入会话中,如:

     request.session["town"] = Town.objects.get(slug=townslug).id
     request.session["town_name"]= Town.objects.get(slug=townslug).name

1 个答案:

答案 0 :(得分:1)

你不能从网址上做到这一点,但你可以通过中间件或基于每个视图(或在多个视图中使用的mixin)来实现。 Here's an example with accessing url arguments from middleware这正是你想要的。

它会是这样的:

class TownSessionMiddleware(object): 
    def process_view(self, request, view_func, view_args, view_kwargs)
        self.set_session_town(request, view_kwargs.get('townslug'))

    def set_session_town(self, request, slug):
        if slug:
            town = Town.objects.get(slug=slug)
            request.session["town"] = town.id
            request.session["town_name"]= town.name

当网址中没有城镇slu((想想主页)时,缓存和替代逻辑取决于您。