这个问题已经困扰我好几天了,我试着在很多地方征求意见,但似乎没有人能清楚地回答,甚至没有人能提供答案的参考。
我也尝试过搜索教程,但我找不到任何类型的教程来解释如何使用可重复使用的第三方django应用程序(大多数教程解释如何编写,没有一个教程解释如何使用)。
另外,我看了一下这里:
如何在Django中重用可重用的应用程序-它没有解释如何在项目本身中实际使用它
这里:
如何将多个可重用的Django应用程序绑定在一起?-Aquapalanet的答案有点道理,但我想我会问这个问题来解决我在试图理解这一点时面临的心理障碍。
为了更好地解释这一点,让我举个例子(注意,这不是我实际构建的东西)
我正在创建一个类似Reddit的项目。我会有用户,链接和投票/积分。基于这个粗略的例子,我想重用3个(任意)第三方应用程序:用户、投票/积分和链接。
我决定将它们中的每一个都用作任何其他python包(这意味着它们将被视为一个包,不应该接触它们的任何代码)[这种方法真的有效吗?或者你必须能够编辑第三方应用程序来构建项目吗?)
现在这些应用程序在我的项目中,我将使用一个主应用程序来处理所有模板内容(这意味着我在前端看到的所有内容都将在一个应用程序中)。
然后,我将使用相同的主应用程序进行自定义逻辑(在views.py中),或者在不同的应用程序之间分解该逻辑(但仍将使用单个仅前端的应用程序)。
从上面的3段来看,这种结构适用吗(或者它能起作用吗)?
现在让我们说这个结构是适用的,我正在使用一个用于前端和自定义逻辑的主应用程序。
我会用models.py写什么?如何将3个可重复使用的应用程序中的内容集成到mainmodels.py文件中?
我将如何引用views.py中的可重用应用程序?让我们以contrib.auth 为例
有了这个内置的应用程序,为了注销,我会写:
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def user_logout(request):
logout(request)
return redirect('/home/')
尽管上面的代码很简单,但任何可重复使用的应用程序基本上都是这样做的吗?
我的问题很长,但我认为这个可重复使用的应用程序问题是很多开发人员自己都不太清楚的,也许这个答案会帮助很多其他人,他们听说过可重复使用应用程序的承诺,但不知道如何实际使用它们。
TL;博士:
没有&这取决于。。。
一些(非常)常见的可重复使用的应用程序
- django.contrib.admin
- django.contrib.auth
- django.contrib.staticfiles
。。。这些都是可重复使用的Django应用程序,碰巧是随Django一起提供的(在某个时候,大多数都不是)
好的,Django没有提供的其他一些可重复使用的应用程序:
- django rest框架
- django注册
- 南
这些都是真正可重复使用的应用程序。像这样的应用程序还有很多。
他们是怎么做到的
对我来说,你的问题更像是"我如何构建可重复使用的应用程序",然后是"如何使用它们"。实际上,不同的应用程序使用它们是非常不同的,因为它们做的事情非常不同。只有一条规则:RTF也没有办法。
通常,他们依赖以下一个或多个:
settings.py
中的附加值- 向
urls.py
添加(通常是一个include
语句) - 模型、窗体、字段、视图等的子类化和/或混合
- 模板标记和/或过滤器
- 管理命令
这些都是功能强大的方式,您的应用程序可以为其他应用程序提供功能。没有制作可重复使用的应用程序的配方(AFAIK),因为有太多不同的场景需要考虑。这完全取决于你的应用程序应该做什么。
可重复使用的应用程序提供功能
我认为,重要的是不要把可重复使用的应用程序视为与其他应用程序"协同工作",而是要认识到它们"提供了功能"。所提供功能的细节应该决定目标开发人员应该如何使用你的库。
不是所有东西都应该可重复使用
很明显,尽管许多应用程序"原则上"可以重复使用,但这样做通常没有什么意义,因为将事物聚集在一起(并使它们"协同工作")要快得多。
我不知道你为什么认为你需要一个用于"前端"的主应用程序。可重复使用的应用程序的要点是它可以处理所有事情,你只需添加(通常)一个URL来包括应用程序的urls.py,以及你自己的模板和样式。
当然,你不需要将应用程序的视图包装在自己的视图中,除非你特别想覆盖某些功能。
我完全不理解你关于模特的问题。没有所谓的"主"模型文件,使用可重复使用的应用程序的模型与使用任何自己的应用程序中的模型是一样的。
通常情况下,你不会编辑第三方应用程序,这会使集成更新变得非常困难。只需使用pip将应用程序安装在你的virtualenv中(当然,你正在使用virtualenv!),它会将其放在lib目录中,你可以像引用任何其他应用程序一样引用它。请确保将其添加到INSTALLED_APPS。