在单个项目中重用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 个回答
我不太确定我是否完全理解你的问题,所以我会列出我理解的内容,如果和你的想法不一样,请告诉我。
- 你想在你的网站上有一个“新闻”和一个“博客”部分,它们的功能是一样的。
- 你希望“新闻”和“博客”的内容在数据库中分别存储,这样它们就不会混在一起。
如果是这样的话,我建议你为你的视图创建一个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"),
这样做可以让你的应用程序变得非常灵活,因为你可以直接从urls.py
中覆盖template
、form
、model
和success_url
。
在这种情况下,你可以把这段共同的代码做成一个Python模块,而不是开发一个全新的应用程序。
然后,对于每一个想要使用它的地方,你只需要创建一个应用,并从那个模块中导入需要的部分就可以了。
博客和新闻之间到底有什么实际的区别呢?也许这个区别应该体现在你的博客/新闻应用里,只需要定义一次就可以了。
假设你有一个博客页面,里面有博客文章,还有一个新闻页面,里面有新闻内容,而它们唯一的区别只是数据库中的一个字段(比如,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 } )
也许你并不需要重复创建两个应用,而是需要扩展现有的应用来同时处理这两种情况。