在单个项目中重用Django应用程序

时间:2009-07-27 13:02:11

标签: python django

在尝试在开发中尽可能多地节省时间并尽可能多地使我的应用程序可重用时,我遇到了一些障碍。在一个网站中,我有一个博客应用程序和一个新闻应用程序,它们大致相同,显然如果我可以创建一个应用程序并在必要时扩展它,然后让它作为两个单独的应用程序与单独的数据库,等

为了澄清,请考虑以下内容:假设,我希望有一个单一的,通用的news_content应用程序,包含所有相关的模型,视图,网址结构和模板标签,然后我可以在必要时包含和扩展多次因为我喜欢单个项目。

分解如下:

news_content/
    templatetags/
        __init__.py
        news_content.py
    __init__.py
    models.py (defines generic models - news_item, category, etc.)
    views.py (generic views for news, archiving, etc.)
    urls.py
    admin.py

有没有办法在不同名称的项目中多次包含此应用程序?我觉得它应该是显而易见的,我只是没有清楚地思考它。有没有人有这方面的经验?

我很感激人们可以给予任何建议。谢谢。

3 个答案:

答案 0 :(得分:3)

博客和新闻之间的实际区别是什么?也许这种差异应该是博客/新闻应用程序的一部分,你只需要包含一次。

如果你有一个包含博客条目的博客页面和一个包含新闻条目的新闻页面,唯一的区别是数据库中的一个字段(kind_of_item =“blog”与kind_of_item =“news”),那么也许你有这个。

urls.py

(r'^/(?P<kind>blog)/$', 'view.stuff'),
(r'^/(?P<kind>news)/$', 'view.stuff'),

views.py

def stuff( request, kind ):
    content= news_blog.objects.filter( kind=kind )
    return render_to_response( kind+"_page", { 'content': content } )

也许您不需要两次相同的应用程序,但需要扩展应用程序以处理这两种用例。

答案 1 :(得分:2)

在这种情况下,您可以将公共代码片段创建为Python模块而不是全新的应用程序。

然后,对于每个要使用它的实例,创建一个应用程序并从该模块导入位。

答案 2 :(得分:1)

我不是100%肯定我理解你的问题,所以我要列出我的理解,并告诉我是否与你的不同。

  1. 您希望网站的“新闻”和“博客”部分具有相同的功能。
  2. 您希望将“新闻”和“博客”条目分别存储在数据库中,这样它们就不会最终混合在一起。
  3. 如果是这种情况,我建议您为自己的观点制作API。像这样:

    views.py

    def view_article(request, article_slug,
            template_name='view_article.html',
            form_class=CommentForm,
            model_class=NewsArticle,
            success_url=None,
            ):
    

    urls.py

    (r'^news/(?P<article_slug>[-\w]+)/$', 'view_article', {}, "view_news_article"),
    (r'^blog/(?P<article_slug>[-\w]+)/$', 'view_article', {'model_class': BlogArticle}, "view_blog_article"),
    

    这使您的应用程序具有高度可重用性,可以直接从template覆盖formmodelsuccess_urlurls.py