如何通过动态加载网址和视图中的模块,在同一个项目中重用Django应用程序

时间:2015-08-03 19:46:31

标签: python django python-3.x django-1.7

我有几乎同一个应用程序的三个实例,我尝试用更可重用的东西替换我的复制粘贴代码。我使用抽象模型解决了模型,如下所示:

# apps.base.myapp.models
class MyAppBase(models.Model):
    name = models.CharField(max_length=60)

    class Meta:
        abstract = True

# apps.site_v1.myapp.models
class MyApp(MyAppBase):
    pass

# apps.site_v2.myapp
class MyApp(MyAppBase):
    pass

对于 site_v1 site_v2 中的应用,我必须添加一个appconfig,因为我无法为两个应用使用相同的名称:

# apps.site_v1.myapp.apps
class CustomAppConfig(AppConfig):
    name = 'apps.site_v1.myapp.apps'
    label = 'site_v1_myapp'

# apps.site_v2.myapp.apps
class CustomAppConfig(AppConfig):
    name = 'apps.site_v2.myapp.apps'
    label = 'site_v2_myapp'

我希望在我的两个版本的网站中的 urls.py views.py 中有以下内容(并且如果我愿意,可以更改它们) :

# apps.site_v1.myapp.views and apps.site_v2.myapp.views
from apps.base.myapp.views import *

# apps.site_v1.myapp.urls and apps.site_v2.myapp.urls
from apps.base.myapp.urls import *

我的问题是,我如何动态设置 apps.base.myapp 中的通用 urls.py views.py 支持此配置?

# apps.base.myapp.urls
views = ??? # Import dynamically, depending on whether I'm on site_v1 or site_v2

urlpatterns = patterns('',
    url(r'^$', views.MyView.as_view(), name='index'),
)

我在 views.py 上详细说明了一下,而且,由于我在网址中有/ v1 /或/ v2 /,我能够获取是否我是m在视图中使用v1或v2并加载正确的模型。但我无法找到如何在 urls.py 中获取此信息的方法,因此我可以加载正确的模块。

在我的主 urls.py 中我已经指定了版本:

# project.urls
urlpatterns = patterns('',
    url(r'^site_v1/', include('urls_site_v1', namespace='site_v1', app_name='cur_site')),
    url(r'^site_v2/', include('urls_site_v2', namespace='site_v2', app_name='cur_site')),
)

因此,如果我可以访问使用的命名空间或以某种方式使用哪个应用程序,我认为它可以解决问题。

只有一个应用程序和一些变量定义它不是一个选项,因为我希望能够单独修改它们并将它们放在不同的数据库中。

0 个答案:

没有答案