首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多部署、可重用的Django应用程序中使用反向current_app?

如何在多部署、可重用的Django应用程序中使用反向current_app?
EN

Stack Overflow用户
提问于 2010-01-09 03:44:14
回答 4查看 6.8K关注 0票数 8

我正在写可重用的应用程序。我想要部署它几次。

下面是urls.py:

代码语言:javascript
复制
urlpatterns = patterns('',
(r'^carphotos/', include('webui.photos.urls', app_name='car-photos') ),
(r'^userphotos/', include('webui.photos.urls',  app_name='profile-photos') ),)

和照片/urls.py:

代码语言:javascript
复制
urlpatterns = patterns('webui.photos.views',
url(r'^$', album_list, name="album-list" )
url(r'^newalbum/$', album_page, {'create': True}, name="album-create"),)

在album_list视图上,我想显示用于创建新专辑album_page的url。

我发现我必须使用反向函数的参数current_app来获取正确的URL。

但是如何获得这个current_app呢?我以为答案很简单。但我在django文档中找不到它。

谢谢,尼克

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-11 16:19:46

在探索了几天这个话题后,我发现多次安装django应用程序是不自然的。

有可插拔应用程序模式的实现:http://github.com/nowells/django-pluggables。它看起来对我来说太难了。

因此,我决定将重复的功能转移到自定义标签和复制模板,用于我的应用程序的每次使用。我希望使用自定义标签和扩展功能可以帮助我遵循DRY原则。

票数 -3
EN

Stack Overflow用户

发布于 2012-11-06 18:28:52

我知道这是一个相当古老的问题...但我想我找到了一个解决方案:

正如哈代建议的那样,你必须保持两个实例的app_name相同(或者根本不定义它,它将默认包含urls所在的应用程序)。但是,为每个应用程序实例定义一个单独的名称空间:

代码语言:javascript
复制
urlpatterns = patterns('',
    (r'^carphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='car-photos') ),
    (r'^userphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='profile-photos') ),
)

现在到了在视图中设置当前活动的应用程序实例(名称空间)的稍微棘手的部分。这意味着你必须找出哪个应用程序实例是活动的,并将其传递给RequestContext

要查找当前活动的应用程序,可以使用django.urls.resolve

代码语言:javascript
复制
r = resolve(request.path)
r.app_name  # the app name
r.namespace # the the currently active instance

因此,您必须相应地更新视图(假设使用基于类的视图):

代码语言:javascript
复制
from django.urls import resolve
from django.views.generic import TemplateView


class AlbumCreateView(TemplateView):
    template_name = 'path/to/my/template.html'
    
    def render_to_response(self, context, **response_kwargs):
        response_kwargs['current_app'] = resolve(self.request.path).namespace
        return super(AlbumPageView, self).render_to_response(context, **response_kwargs)

现在,url标签将自动反转到正确的名称空间,如果需要,仍然允许反转到特定的应用程序名称空间:

代码语言:javascript
复制
{% url webui_photos:album-create %} {# returns the url for whatever app is current #}
{% url car-photos:album-create %}
{% url profile-photos:album-create %}

要反转视图中的urls,必须手动传入当前的应用实例:

代码语言:javascript
复制
reverse('webui_photos:album-create', current_app=resolve(self.request.path).namespace))
票数 12
EN

Stack Overflow用户

发布于 2010-01-09 06:21:30

在你的app_name中,你有一个不同的urls,即使它是相同的应用程序。将app_name设置为相同的内容,并为每个实例唯一地设置namespace。例如:

代码语言:javascript
复制
urlpatterns = patterns('',
(r'^carphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='car-photos') ),
(r'^userphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='profile-photos') ),)

然后在使用reverse时提供current_app参数。请参阅http://docs.djangoproject.com/en/dev/topics/http/urls/#reversehttp://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces

重新阅读您的问题后进行编辑:

如果使用{% url %}标记,则不需要提供current_app参数。据我所知,它将自动访问一个名为current_app的模板变量,该变量是根据匹配的url自动设置的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2030225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档