“Django/docs/3.0.x/intro/contributing”的版本间差异

来自菜鸟教程
Django/docs/3.0.x/intro/contributing
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:为 Django 编写第一个补丁 — Django 文档}}
 
<div id="writing-your-first-patch-for-django" class="section">
 
<div id="writing-your-first-patch-for-django" class="section">
  
= 编写你的第一个 Django 补丁 =
+
= Django 编写你的第一个补丁 =
  
 
<div id="introduction" class="section">
 
<div id="introduction" class="section">
  
== 介绍 ==
+
== 简介 ==
  
想为 Django 社区做一点贡献?也许是你发现了一个想修复的 bug,或者想添加一个新的功能。
+
有兴趣回馈社区吗? 也许您在 Django 中发现了一个您希望修复的错误,或者您想要添加一个小功能。
  
回报 Django 这件事本身就是使你的顾虑得到解决的最好方式。一开始这可能会使你怯步,但这是一条有文档、工具和社区支持的成功之路。整个过程中我们会一步一步为你解说,所以你可以通过例子学习。
+
回馈 Django 本身是解决您自己的问题的最佳方式。 乍一看,这似乎令人生畏,但它是一条经过广泛探索的路径,其中包含文档、工具和支持您的社区。 我们将引导您完成整个过程,以便您可以通过示例进行学习。
  
 
<div id="who-s-this-tutorial-for" class="section">
 
<div id="who-s-this-tutorial-for" class="section">
  
=== 这个教程适合谁? ===
+
=== 这个教程是给谁看的? ===
  
 
<div class="admonition seealso">
 
<div class="admonition seealso">
  
参见
+
也可以看看
  
如果你正在寻找一个关于如何提交补丁的说明文档,请查看 [[../../internals/contributing/writing-code/submitting-patches|<span class="doc">Submitting patches</span>]]
+
如果您正在寻找有关如何提交补丁的参考,请参阅 [[../../internals/contributing/writing-code/submitting-patches|提交补丁]] 文档。
  
  
 
</div>
 
</div>
使用教程前,我们希望你至少对于 Django 的运行方式有一定的认识。 这意味着你可以很容易地通读 [[../tutorial01|<span class="doc">编写第一个 Django 应用</span>]]。 除此之外,你应该对于 Python 有很好的理解。 如果不太熟悉 Python,我们为您推荐 [[#id11|<span id="id12" class="problematic">`Dive Into Python`__</span>]] 对于初学Python的程序员来说这是一本很棒(而且免费)的在线电子书。
+
对于本教程,我们希望您至少对 Django 的工作原理有基本的了解。 这意味着您应该可以轻松浏览有关 [[../tutorial01|编写第一个 Django 应用程序]] 的现有教程。 此外,您应该对 Python 本身有很好的了解。 但如果你不这样做,[https://diveinto.org/python3/table-of-contents.html 深入 Python] 是一本非常棒的(免费的)在线书籍,适合 Python 初学者。
  
那些不熟悉版本控制系统及缺陷跟踪的朋友可以查看这个教程,这个链接包含了足够的信息。如果你打算定期地为 Django 做贡献,你可能期望阅读更多关于这些不同工具的资料。
+
那些不熟悉版本控制系统和 Trac 的人会发现本教程及其链接包含的信息刚好足以开始使用。 但是,如果您计划定期为 Django 做出贡献,您可能需要阅读更多有关这些不同工具的信息。
  
当然对于此教程中的大部分内容,Django 会尽可能做出解释以帮助广大的读者。
+
不过,在大多数情况下,本教程尝试尽可能多地进行解释,以便对最广泛的受众有用。
  
 
<div class="admonition-where-to-get-help admonition">
 
<div class="admonition-where-to-get-help admonition">
第33行: 第34行:
 
从哪里获得帮助:
 
从哪里获得帮助:
  
如果你在使用本教程时遇到困难, 你可以发信息给 [[../../internals/mailing-lists#django-developers-mailing-list|<span class="std std-ref">django-developers</span>]] 中的人或登陆 [[#id11|<span id="id13" class="problematic">`#django-dev on irc.freenode.net`__</span>]] 向其他 Django 使用者寻求帮助。
+
如果您在阅读本教程时遇到问题,请向 [[../../internals/mailing-lists#django-developers-mailing-list|django-developers]] 发消息或访问 irc.freenode.net [irc://irc.freenode.net/django-dev 上的] #django-dev 与其他 Django 用户聊天谁能帮忙。
  
  
第41行: 第42行:
 
<div id="what-does-this-tutorial-cover" class="section">
 
<div id="what-does-this-tutorial-cover" class="section">
  
=== 这个指南涵盖哪些内容? ===
+
=== 本教程涵盖哪些内容? ===
  
我们将指导你贡献你的第一个 Django 补丁,在本教程完毕时,你将对相关工具及流程有一个基本的认识。特别的,我们将覆盖以下内容:
+
我们将引导您第一次向 Django 贡献补丁。 在本教程结束时,您应该对所涉及的工具和流程有基本的了解。 具体来说,我们将涵盖以下内容:
  
 
* 安装 Git。
 
* 安装 Git。
* 下载一份Django开发版的拷贝。
+
* 下载 Django 开发版本的副本。
 
* 运行 Django 的测试套件。
 
* 运行 Django 的测试套件。
* 为你的补丁写一个测试。
+
* 为您的补丁编写测试。
* 为你的补丁编写代码。
+
* 为您的补丁编写代码。
* 测试你的补丁。
+
* 测试您的补丁。
* 提交一个 pull request(PR)。
+
* 提交拉取请求。
* 在哪里查找更多的信息。
+
* 在哪里寻找更多信息。
  
一旦你完成了这份教程,你可以浏览 [[../../internals/contributing/index|<span class="doc">Django 贡献文档</span>]] 的剩余部分。它包含了大量信息。任何想成为 Django 的正式贡献者的人都必须阅读它。如果你有问题,它也许会给你答案。
+
完成本教程后,您可以查看 [[../../internals/contributing/index|Django 中关于贡献]] 的文档的其余部分。 它包含许多重要信息,是任何想成为 Django 定期贡献者的人的必读之物。 如果你有问题,它可能有答案。
  
 
<div class="admonition-python-3-required admonition">
 
<div class="admonition-python-3-required admonition">
  
必须Python 3!
+
需要 Python 3!
  
目前的 Django 版本不再支持 Python 2.7。你可以在 [https://www.python.org/downloads/ Python 下载页] 或通过操作系统的包管理器下载 Python 3。
+
当前版本的 Django 不支持 Python 2.7。 在 [https://www.python.org/downloads/ Python 的下载页面] 或使用操作系统的包管理器获取 Python 3。
  
  
第68行: 第69行:
 
对于 Windows 用户
 
对于 Windows 用户
  
See [[../../howto/windows#install-python-windows|<span class="std std-ref">安装Python</span>]] on Windows docs for additional guidance.
+
有关其他指导,请参阅 Windows 文档上的 [[../../howto/windows#install-python-windows|Install Python]]
  
  
第78行: 第79行:
 
<div id="code-of-conduct" class="section">
 
<div id="code-of-conduct" class="section">
  
== 代码规范 ==
+
== 行为准则 ==
  
作为一个贡献者, 你可以帮助我们保持 Django 的社区开放性和包容性。请仔细阅读并遵守我们的 [https://www.djangoproject.com/conduct/ 行为守则]。
+
作为贡献者,您可以帮助我们保持 Django 社区的开放性和包容性。 请阅读并遵守我们的 [https://www.djangoproject.com/conduct/ 行为准则] 。
  
  
第86行: 第87行:
 
<div id="installing-git" class="section">
 
<div id="installing-git" class="section">
  
== 安装Git ==
+
== 安装 Git ==
  
在本教程中,你需要安装好 Git,用 Git 下载 Django 的最新开发版本并且为你的修改生成补丁文件。
+
对于本教程,您需要安装 Git 来下载 Django 的当前开发版本并为您所做的更改生成补丁文件。
  
要检查你是否已经安装 Git,命令行输入 <code>git</code>。如果提示这个命令无法找到,你必须下载并安装它,参考 [[#id11|<span id="id14" class="problematic">`Git's download page`__</span>]] 。
+
要检查您是否安装了 Git,请在命令行中输入 <code>git</code>。 如果您收到消息说找不到此命令,则必须下载并安装它,请参阅 [https://git-scm.com/download Git 的下载页面] 。
  
如果你还不熟悉 Git, 你可以在命令行下输入 <code>git help</code> 了解更多关于 Git 命令的使用方法 (确保已安装)
+
如果您不太熟悉 Git,您总是可以通过在命令行中输入 <code>git help</code> 来了解有关其命令的更多信息(安装后)。
  
  
第98行: 第99行:
 
<div id="getting-a-copy-of-django-s-development-version" class="section">
 
<div id="getting-a-copy-of-django-s-development-version" class="section">
  
== 获得一个 Django 开发版本的副本 ==
+
== 获取 Django 开发版本的副本 ==
  
为 Django 做贡献的第一步就是获取源代码副本。首先, fork Github 上的 Django 项目 &lt;https://github.com/django/django/fork&gt;。接下来,在命令行中,使用 <code>cd</code> 命令切换至某个你想存放 Django 源码的目录。
+
为 Django 做出贡献的第一步是获取源代码的副本。 首先, [https://github.com/django/django/fork 在 GitHub] 上 fork Django。 然后,从命令行,使用 <code>cd</code> 命令导航到您希望 Django 的本地副本所在的目录。
  
使用下面的命令来下载 Django 的源码库:
+
使用以下命令下载 Django 源代码库:
  
<div class="highlight-console notranslate">
 
 
<div class="highlight">
 
 
<pre>$ git clone https://github.com/YourGitHubName/django.git</pre>
 
 
</div>
 
 
</div>
 
 
<div class="admonition-low-bandwidth-connection admonition">
 
<div class="admonition-low-bandwidth-connection admonition">
  
低速宽带连接?
+
低带宽连接?
  
你可以在用命令 <code>git clone</code> 下载仓库的时候加上参数 <code>--depth 1</code> 来跳过 Django 的提交历史,这大约能把下载大小从250MB减少到70MB
+
您可以将 <code>--depth 1</code> 参数添加到 <code>git clone</code> 以跳过下载所有 Django 的提交历史记录,从而将数据传输从 ~250 MB 减少到 ~70 MB。
  
  
 
</div>
 
</div>
你现在已经将Django拷贝到本地,可以像安装其他软件包一样使用 [[#id1|<span id="id2" class="problematic">``</span>]]pip``进行安装。 最便捷的方式是通过 ''virtual environment'', 这是 Python 的一个内置特性,它可以让你在一个目录中保持独立的软件包环境而不影响其他的项目。
+
现在您有了 Django 的本地副本,您可以像使用 <code>pip</code> 安装任何软件包一样安装它。 最方便的方法是使用 ''虚拟环境'' ,这是 Python 内置的一项功能,允许您为每个项目保留一个单独的已安装包目录,以便它们不会干扰彼此。
 
 
将你的虚拟环境都放在一个位置是明智的做法,例如将它们放置在你主目录下的 <code>.virtualenvs/</code> 中。
 
  
通过运行以下命令创建一个虚拟环境:
+
将所有虚拟环境保存在一个地方是一个好主意,例如在您的主目录中的 <code>.virtualenvs/</code> 中。
  
<div class="highlight-console notranslate">
+
通过运行创建一个新的虚拟环境:
  
<div class="highlight">
+
该路径是新环境将在您的计算机上保存的位置。
  
<pre>$ python3 -m venv ~/.virtualenvs/djangodev</pre>
+
设置虚拟环境的最后一步是激活它:
 
 
</div>
 
 
 
</div>
 
该路径就是保存这个新的虚拟运行环境的地方。
 
 
 
设置虚拟环境的最后一步是激活它;
 
  
 
<div class="highlight-console notranslate">
 
<div class="highlight-console notranslate">
第144行: 第127行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>$ source ~/.virtualenvs/djangodev/bin/activate</pre>
+
<syntaxhighlight lang="console">$ source ~/.virtualenvs/djangodev/bin/activate</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
如果 <code>source</code> 命令不可用,你可以试试:
+
如果 <code>source</code> 命令不可用,您可以尝试使用点代替:
  
 
<div class="highlight-console notranslate">
 
<div class="highlight-console notranslate">
第155行: 第138行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>$ . ~/.virtualenvs/djangodev/bin/activate</pre>
+
<syntaxhighlight lang="console">$ . ~/.virtualenvs/djangodev/bin/activate</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
每当打开一个新的终端窗口,都必须先激活虚拟环境。
+
每当您打开新的终端窗口时,您都必须激活虚拟环境。
  
 
<div class="admonition-for-windows-users admonition">
 
<div class="admonition-for-windows-users admonition">
第166行: 第149行:
 
对于 Windows 用户
 
对于 Windows 用户
  
在Windows下采用如下命令进行激活虚拟环境:
+
要在 Windows 上激活您的虚拟环境,请运行:
  
 
<div class="highlight-doscon notranslate">
 
<div class="highlight-doscon notranslate">
第172行: 第155行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>...\&gt; %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat</pre>
+
<syntaxhighlight lang="doscon">...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat</syntaxhighlight>
  
 
</div>
 
</div>
第179行: 第162行:
  
 
</div>
 
</div>
当前激活的虚拟环境的名称会被展示在命令行,这可以让你搞清楚你正在使用哪一个虚拟环境。你通过 <code>pip</code> 安装的任何软件包如果在安装时显示了该名称,则都会被安装到该虚拟环境中,而且这些软件包不会影响到其他虚拟环境,也不会与其他系统级的软件包发生冲突。
+
当前激活的虚拟环境的名称显示在命令行上,以帮助您跟踪正在使用的虚拟环境。 在显示此名称时通过 <code>pip</code> 安装的任何内容都将安装在该虚拟环境中,与其他环境和系统范围的软件包隔离。
  
下一步安装之前克隆的 Django 副本:
+
继续安装之前克隆的 Django 副本:
  
<div class="highlight-console notranslate">
+
通过以可编辑模式安装,已安装的 Django 版本现在指向您的本地副本。 您将立即看到对其所做的任何更改,这在编写第一个补丁时非常有帮助。
 
 
<div class="highlight">
 
 
 
<pre>$ python -m pip install -e /path/to/your/local/clone/django/</pre>
 
 
 
</div>
 
 
 
</div>
 
在可编辑的模式下,安装的 Django 版本就是你本地副本的版本。你将立刻见到任何你对它的修改,这对你编写第一个补丁很有帮助。
 
  
 
<div id="creating-projects-with-a-local-copy-of-django" class="section">
 
<div id="creating-projects-with-a-local-copy-of-django" class="section">
  
=== 使用 Django 本地副本创建项目 ===
+
=== 使用 Django 的本地副本创建项目 ===
  
这对你测试本地Django项目发生了那些变化很有帮助。首先,你需要创建一个新的虚拟环境, [[#intro-contributing-install-local-copy|<span class="std std-ref">在可编辑模式下安装之前克隆的Django本地副本</span>]], 接着在你本地Django副本之外创建一个新的Django项目。 在你的新项目中,一旦你改动任何文件,你都会立刻看到相关信息,这对你编写第一个补丁是很有帮助的。
+
使用 Django 项目测试您的本地更改可能会有所帮助。 首先,您必须创建一个新的虚拟环境, [[#intro-contributing-install-local-copy|以可编辑模式]] 安装先前克隆的 Django 本地副本,并在您的 Django 本地副本之外创建一个新的 Django 项目。 您将立即在新项目中看到对 Django 所做的任何更改,这在编写第一个补丁时很有帮助。
  
  
第206行: 第180行:
 
<div id="running-django-s-test-suite-for-the-first-time" class="section">
 
<div id="running-django-s-test-suite-for-the-first-time" class="section">
  
== 首先运行 Django 的测试套件 ==
+
== 第一次运行 Django 的测试套件 ==
 
 
当你贡献代码给 Django 的时候,你修改的代码千万不要给其它部分引入新的 bug。 有个办法可以在你更改代码之后检查 Django 是否能正常工作,就是运行 Django 的测试套件。如果所有的测试用例都通过,你就有理由相信你的改动完全没有破坏 Django。如果你从来没有运行过 Django 的测试套件,那么比较好的做法是事先运行一遍,熟悉下正常情况下应该输出什么结果。
 
 
 
运行测试套件之前,先 <code>cd</code> 进入 Django 的 <code>test/</code> 目录,安装其依赖,运行:
 
 
 
<div class="highlight-console notranslate">
 
 
 
<div class="highlight">
 
 
 
<pre>$ python -m pip install -r requirements/py3.txt</pre>
 
 
 
</div>
 
 
 
</div>
 
如果安装过程中发生了错误,可能是你的系统缺少一个或多个 Python 依赖包。请参考安装失败的包的文档或者在网上搜索提示的错误信息。
 
  
现在你可以运行测试套件。如果你用的是 GNU/Linux, macOS 或者其它类 Unix 系统,运行:
+
在为 Django 做出贡献时,重要的是您的代码更改不会将错误引入 Django 的其他领域。 在您进行更改后检查 Django 是否仍然有效的一种方法是运行 Django 的测试套件。 如果所有测试仍然通过,那么您可以合理地确定您的更改有效并且没有破坏 Django 的其他部分。 如果您以前从未运行过 Django 的测试套件,最好事先运行一次以熟悉其输出。
  
<div class="highlight-console notranslate">
+
在运行测试套件之前,通过 <code>cd</code>-ing 将其依赖项安装到 Django <code>tests/</code> 目录中,然后运行:
  
<div class="highlight">
+
如果您在安装过程中遇到错误,您的系统可能缺少一个或多个 Python 包的依赖项。 查阅失败包的文档或使用您遇到的错误消息在 Web 上搜索。
  
<pre>$ ./runtests.py</pre>
+
现在我们准备运行测试套件。 如果您使用的是 GNU/Linux、macOS 或其他一些 Unix 版本,请运行:
  
</div>
+
现在坐下来放松一下。 Django 的整个测试套件有数千个测试,运行至少需要几分钟,具体取决于您的计算机速度。
  
</div>
+
当 Django 的测试套件运行时,您会看到一个字符流,代表每个测试完成时的状态。 <code>E</code> 表示测试期间出现错误,<code>F</code> 表示测试断言失败。 这两个都被认为是测试失败。 同时,<code>x</code> 和 <code>s</code> 分别表示预期失败和跳过测试。 点表示通过测试。
接下来,需要耐心等待一段时间,因为 Django 的整个测试套件有数千个测试项,一般需要几分钟的时间才能运行结束。
 
  
当Django的测试套件被执行时,您将看到一个代表测试运行状态的字符流。 其中字符 <code>E</code> 表示测试中出现异常, <code>F</code> 表示测试中的一个断言失败,这两种情况都被认为测试结果失败。而 <code>x</code> 和 <code>s</code> 分别表示与期望结果不同和跳过测试,逗点则表示测试被通过了。
+
跳过测试通常是由于缺少运行测试所需的外部库; 请参阅 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests-dependencies|运行所有测试]] 以获取依赖项列表,并确保为与您所做更改相关的测试安装任何测试(本教程不需要任何测试)。 某些测试特定于特定的数据库后端,如果不使用该后端进行测试,将被跳过。 SQLite 是默认设置的数据库后端。 要使用不同的后端运行测试,请参阅 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests-settings|使用另一个设置模块]] 。
  
缺失外部依赖库通常会导致测试被跳过;查看 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests-dependencies|<span class="std std-ref">Running all the tests</span>]] 获取依赖库列表,如果你修改了测试代码,请同时安装相关依赖库(本教程无需额外依赖库)。某些测试使用了特定的数据库后端,如果当前测试设置并未使用此数据库后端,那么这些相关的测试也会被跳过。SQLite 是默认的数据库后端。如果想使用其他后端进行测试,查看 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests-settings|<span class="std std-ref">Using another settings module</span>]]。
+
测试完成后,您应该会收到一条消息,通知您测试套件是通过还是失败。 由于您尚未对 Django 的代码进行任何更改,因此整个测试套件 '''应该''' 通过。 如果您遇到失败或错误,请确保您已正确执行所有前面的步骤。 有关更多信息,请参阅 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests|运行单元测试]] 。
  
代码测试集当测试执行完毕后,得到反馈信息显示测试已通过,或者测试失败。 因为还没有对 Django 的代码做任何修改, 所有的测试集 '''应该''' 测试通过. 如果测试失败或出现错误,回头确认以上执行操作是否正确. 查看 [[../../internals/contributing/writing-code/unit-tests#running-unit-tests|<span class="std std-ref">Running the unit tests</span>]] 获取更多信息。
+
请注意,最新的 Django master 可能并不总是稳定的。 在针对 master 开发时,您可以检查 [https://djangoci.com Django 的持续集成构建] 以确定故障是否特定于您的机器,或者它们是否也存在于 Django 的官方构建中。 如果单击查看特定构建,则可以查看“配置矩阵”,其中显示了按 Python 版本和数据库后端细分的故障。
 
 
注意最新版本 Django 分支不总是稳定的。当在分支上开发时,你可以查看代码持续集成构建页面的信息 来判断测试错误只在你指定的电脑上发生,还是官方版本中也存在该错误。如果点击某个构建信息,可以通过 &quot;Configuration Matrix&quot; 查看错误发生时 Python 以及后端数据库的信息。
 
  
 
<div class="admonition note">
 
<div class="admonition note">
  
注解
+
笔记
  
在本教程以及处理工单所用分支中,测试使用数据库 SQLite 即可,然而在某些情况下需要(有时需要) ,参考 :ref:[[#id1|<span id="id2" class="problematic">`</span>]]run the tests using a different database [[#id3|<span id="id4" class="problematic">`</span>]]
+
对于本教程和我们正在处理的票证,针对 SQLite 进行测试就足够了,但是,可以(有时需要) [[../../internals/contributing/writing-code/unit-tests#running-unit-tests-settings|使用不同的数据库]] 运行测试。
  
  
第256行: 第212行:
 
<div id="working-on-a-feature" class="section">
 
<div id="working-on-a-feature" class="section">
  
== 尝试搞定一项新功能 ==
+
== 处理功能 ==
  
这次教程中,我们将学习去完成一个名叫 &quot;fake ticket&quot; 的例子。下面是关于这个例子的大体构想:
+
在本教程中,我们将使用“假票”作为案例研究。 以下是想象中的细节:
  
 
<div class="admonition-ticket-99999-allow-making-toast admonition">
 
<div class="admonition-ticket-99999-allow-making-toast admonition">
  
Ticket #99999 -- 允许发表祝辞
+
票号 #99999 – 允许烤面包
  
Djando中需要声明一个函数django.shortcuts.make_toast(),它的返回值为'toast'
+
Django 应该提供一个返回 <code>'toast'</code> 的函数 <code>django.shortcuts.make_toast()</code>
  
  
 
</div>
 
</div>
我们现在来实现这个新功能并且做一下相关的测试。
+
我们现在将实现此功能和相关测试。
  
  
第274行: 第230行:
 
<div id="creating-a-branch-for-your-patch" class="section">
 
<div id="creating-a-branch-for-your-patch" class="section">
  
== 为你的补丁创建一个分支 ==
+
== 为您的补丁创建一个分支 ==
  
在做出任何修改之前,为你的工单创建一个分支:
+
在进行任何更改之前,为票证创建一个新分支:
  
<div class="highlight-console notranslate">
+
您可以为分支选择任何您想要的名称,例如“ticket_99999”。 在此分支中所做的所有更改都将特定于票证,不会影响我们之前克隆的代码的主副本。
 
 
<div class="highlight">
 
 
 
<pre>$ git checkout -b ticket_99999</pre>
 
 
 
</div>
 
 
 
</div>
 
你可以选择任意你想要的分支名,ticket_99999只是一个例子。你在该分支上做出的所有更改,将只会针对该分支即ticket_99999产生影响,而不会影响到我们早先克隆的原始代码。
 
  
  
第293行: 第240行:
 
<div id="writing-some-tests-for-your-ticket" class="section">
 
<div id="writing-some-tests-for-your-ticket" class="section">
  
== 为你的工单写一些测试用例 ==
+
== 为您的机票编写一些测试 ==
  
大多数情况下,Django 的补丁必需包含测试。Bug 修复补丁的测试是一个回归测试,确保该 Bug 不会再次在 Django 中出现。该测试应该在 Bug 存在时测试失败,在 Bug 已经修复后通过测试。新功能补丁的测试必须验证新功能是否正常运行。新功能的测试将在功能正常时通过测试,功能未执行时测试失败。
+
在大多数情况下,要让 Django 接受补丁,它必须包含测试。 对于错误修复补丁,这意味着编写回归测试以确保该错误以后永远不会重新引入 Django。 回归测试应该以这样的方式编写,即在错误仍然存在时它会失败并在错误被修复后通过。 对于包含新功能的补丁,您需要包括确保新功能正常工作的测试。 当新功能不存在时,它们也应该失败,然后在实现后通过。
  
最好的方式是在修改代码之前写测试单元代码。这种开发风格叫做 [[#id11|<span id="id15" class="problematic">`test-driven development`__</span>]] 被应用在项目开发和单一补丁开发过程中。单元测试编写完毕后,执行单元测试,此时测试失败(因为目前还没有修复 bug 或添加新功能),如果测试成功通过,你需要重新修改单元测试保证测试失败。因为单元测试并不能阻止 bug 发生。
+
这样做的一个好方法是先编写新测试,然后再对代码进行任何更改。 这种开发风格称为[https://en.wikipedia.org/wiki/Test-driven_development 测试驱动开发],可以应用于整个项目和单个补丁。 编写测试后,然后运行它们以确保它们确实失败(因为您尚未修复该错误或添加该功能)。 如果您的新测试没有失败,您将需要修复它们以便它们成功。 毕竟,无论是否存在错误都通过的回归测试对于防止该错误再次发生并没有多大帮助。
  
现在看我们的操作示例。
+
现在是我们的动手示例。
  
 
<div id="writing-a-test-for-ticket-99999" class="section">
 
<div id="writing-a-test-for-ticket-99999" class="section">
  
=== 为工单 #99999 写测试 ===
+
=== 为票证编写测试 #99999 ===
  
为了解决这次的工单问题,我们将在最上层的 django 模块中添加一个函数 <code>make_toast()</code>。首先我们来写一个测试用例,用于测试该函数,并且验证一下它的输出项是否正确。
+
为了解决这个问题,我们将在顶层 <code>django</code> 模块中添加一个 <code>make_toast()</code> 函数。 首先,我们将编写一个测试,尝试使用该函数并检查其输出是否正确。
  
前往Django的 <code>tests/shortcuts/</code> 文件夹,创建一个名为 <code>test_make_toast.py</code> 的新文件。添加如下代码:
+
导航到 Django 的 <code>tests/shortcuts/</code> 文件夹并创建一个新文件 <code>test_make_toast.py</code>。 添加以下代码:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第313行: 第260行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from django.shortcuts import make_toast
+
<syntaxhighlight lang="python">from django.shortcuts import make_toast
 
from django.test import SimpleTestCase
 
from django.test import SimpleTestCase
  
第319行: 第266行:
 
class MakeToastTests(SimpleTestCase):
 
class MakeToastTests(SimpleTestCase):
 
     def test_make_toast(self):
 
     def test_make_toast(self):
         self.assertEqual(make_toast(), 'toast')</pre>
+
         self.assertEqual(make_toast(), 'toast')</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
上述测试是用来检测 <code>make_toast()</code> 函数是否会返回 [[#id1|<span id="id2" class="problematic">``</span>]]'toast'` [[#id3|<span id="id4" class="problematic">`</span>]]的。
+
此测试检查 <code>make_toast()</code> 是否返回 <code>'toast'</code>
  
 
<div class="admonition-but-this-testing-thing-looks-kinda-hard admonition">
 
<div class="admonition-but-this-testing-thing-looks-kinda-hard admonition">
  
但这种测试看起来有点困难……
+
但是这个测试的东西看起来有点难……
  
如果你之前从未处理过测试,那他们看起来会有点难以编写。幸运的是,测试是一个计算机编程中 ''非常'' 大的一个主题,所以这里有大量的相关资料:
+
如果您以前从未处理过测试,那么乍一看它们可能看起来有点难以编写。 幸运的是,测试是计算机编程中一个 ''非常'' 的大主题,因此有很多信息:
  
* 浏览 [[../../topics/testing/overview|<span class="doc">编写并运行测试</span>]] 大致看一下如何在 Django 中编写测试。
+
* 可以在 [[../../topics/testing/overview|编写和运行测试]] 的文档中找到有关为 Django 编写测试的初步了解。
* 深入理解 Python(一本针对 Python 初学者的免费在线书籍),包含了不错的 [[#id11|<span id="id16" class="problematic">`introduction to Unit Testing`__</span>]]。
+
* Dive Into Python(一本面向 Python 初学者的免费在线书籍)包括对单元测试 [https://www.diveinto.org/python3/unit-testing.html 的精彩介绍] 。
* 读到这里,你还想深入了解的话,可以查看 Python <code>unittest</code>
+
* 阅读完这些之后,如果您想要更深入地了解一些内容,总有 Python <code>unittest</code> 文档。
  
  
第344行: 第291行:
 
=== 运行你的新测试 ===
 
=== 运行你的新测试 ===
  
由于我们还没有对 <code>django.shortcuts</code> 进行任何修改,这次测试将会失败。现在让我们来运行一下 <code>shortcuts</code> 目录中的所有测试,以便确定它们真的都会产生失败的结果。使用 <code>cd</code> 命令进入Django的 <code>tests/</code> 文件夹,然后运行:
+
由于我们还没有对 <code>django.shortcuts</code> 进行任何修改,我们的测试应该会失败。 让我们运行 <code>shortcuts</code> 文件夹中的所有测试,以确保这确实发生了。 <code>cd</code> 到 Django <code>tests/</code> 目录并运行:
 
 
<div class="highlight-console notranslate">
 
 
 
<div class="highlight">
 
 
 
<pre>$ ./runtests.py shortcuts</pre>
 
 
 
</div>
 
  
</div>
+
如果测试运行正确,您应该会看到一个与我们添加的测试方法相对应的失败,并显示以下错误:
如果测试被正确执行,一个该测试方法所对应的错误将会呈现给你:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第361行: 第299行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>ImportError: cannot import name 'make_toast' from 'django.shortcuts'</pre>
+
<syntaxhighlight lang="python">ImportError: cannot import name 'make_toast' from 'django.shortcuts'</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
如果所有测试都执行过了,那么你要确保在准确的文件夹和文件名中添加了上述新测试。
+
如果所有测试都通过了,那么您需要确保将上面显示的新测试添加到适当的文件夹和文件名中。
  
  
第374行: 第312行:
 
<div id="writing-the-code-for-your-ticket" class="section">
 
<div id="writing-the-code-for-your-ticket" class="section">
  
== 为你的工单编写代码 ==
+
== 为您的机票编写代码 ==
  
接下来我们将添加 <code>make_toast()</code> 函数
+
接下来我们将添加 <code>make_toast()</code> 函数。
  
打开 <code>django/</code> 文件夹中的 <code>shortcuts.py</code> 文件,在文件末尾追加:
+
导航到 <code>django/</code> 文件夹并打开 <code>shortcuts.py</code> 文件。 在底部添加:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第384行: 第322行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>def make_toast():
+
<syntaxhighlight lang="python">def make_toast():
     return 'toast'</pre>
+
     return 'toast'</syntaxhighlight>
 
 
</div>
 
  
 
</div>
 
</div>
现在我们需要保证之前所写的测试会正常通过,以便我们判断所追加的代码是否正确。再来一次,现跳转到Django的 <code>tests/</code> 目录,然后执行:
 
 
<div class="highlight-console notranslate">
 
 
<div class="highlight">
 
 
<pre>$ ./runtests.py shortcuts</pre>
 
  
 
</div>
 
</div>
 +
现在我们需要确保我们之前编写的测试通过,以便我们可以查看我们添加的代码是否正常工作。 再次导航到 Django <code>tests/</code> 目录并运行:
  
</div>
+
一切都应该过去。 如果没有,请确保您将函数正确添加到正确的文件中。
所有项目都需要正常通过测试。如果没有,检查一下你的函数是否书写正确,并且是否写在了正确的文件中。
 
  
  
第407行: 第336行:
 
<div id="running-django-s-test-suite-for-the-second-time" class="section">
 
<div id="running-django-s-test-suite-for-the-second-time" class="section">
  
== 第二次运行 Django 测试套件 ==
+
== 第二次运行 Django 的测试套件 ==
  
如果已经确认补丁以及测试结果都正常,就运行 Django 的测试套件,验证你的修改是否导致 Django 的其它部分引入了新的 bug。 虽然测试用例帮助识别容易被人忽略的错误,但测试通过并不能保证完全没有 bug 存在。
+
一旦您确认您的补丁和您的测试工作正常,最好运行整个 Django 测试套件以验证您的更改没有将任何错误引入 Django 的其他区域。 虽然成功通过整个测试套件并不能保证您的代码没有错误,但它确实有助于识别许多否则可能会被忽视的错误和回归。
  
运行 Django 完整的测试用例,<code>cd</code> 进入 Django下的 <code>tests/</code> 目录并运行:
+
要运行整个 Django 测试套件,<code>cd</code> 进入 Django <code>tests/</code> 目录并运行:
  
<div class="highlight-console notranslate">
 
 
<div class="highlight">
 
 
<pre>$ ./runtests.py</pre>
 
 
</div>
 
 
</div>
 
  
 
</div>
 
</div>
 
<div id="writing-documentation" class="section">
 
<div id="writing-documentation" class="section">
  
== 书写文档 ==
+
== 编写文档 ==
  
这是一项新功能,所以应该为它建立一个说明,打开文件 <code>docs/topics/http/shortcuts.txt</code> ,然后在文件末尾追加下记内容:
+
这是一个新功能,所以应该记录下来。 打开文件 <code>docs/topics/http/shortcuts.txt</code> 并在文件末尾添加以下内容:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第434行: 第354行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>``make_toast()``
+
<syntaxhighlight lang="python">``make_toast()``
 
================
 
================
  
 
.. versionadded:: 2.2
 
.. versionadded:: 2.2
  
Returns ``'toast'``.</pre>
+
Returns ``'toast'``.</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
由于这一新功能将在即将到来的版本中被加入,所以下个版本的发布说明里也加入了相关内容。打开 <code>docs/releases/2.2.txt</code> 文件,即发布说明的最新版本文件,在小标题&quot;Minor Features&quot;下面添加一个说明:
+
由于此新功能将在即将发布的版本中出现,因此它也被添加到下一版 Django 的发行说明中。 在 <code>docs/releases/</code> 中打开最新版本的发行说明,在撰写本文时为 <code>2.2.txt</code>。 在“次要功能”标题下添加注释:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第450行: 第370行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>:mod:`django.shortcuts`
+
<syntaxhighlight lang="python">:mod:`django.shortcuts`
 
~~~~~~~~~~~~~~~~~~~~~~~
 
~~~~~~~~~~~~~~~~~~~~~~~
  
* The new :func:`django.shortcuts.make_toast` function returns ``'toast'``.</pre>
+
* The new :func:`django.shortcuts.make_toast` function returns ``'toast'``.</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
更多关于编写文档和 <code>versionadded</code> 的解释和信息,请参考 [[../../internals/contributing/writing-documentation|<span class="doc">编写文档</span>]]。这个页面还介绍了怎么在本地重新生成一份文档,方便你在本地预览文档。
+
有关编写文档的更多信息,包括对 <code>versionadded</code> 位的全部内容的解释,请参阅 [[../../internals/contributing/writing-documentation|编写文档]] 。 该页面还包括如何在本地构建文档副本的说明,以便您可以预览将生成的 HTML。
  
  
第464行: 第384行:
 
<div id="previewing-your-changes" class="section">
 
<div id="previewing-your-changes" class="section">
  
== 预览你的修改 ==
+
== 预览您的更改 ==
 
 
现在是时候完成我们这个分支的所有变更,准备将它们提交了,执行:
 
 
 
<div class="highlight-console notranslate">
 
 
 
<div class="highlight">
 
 
 
<pre>$ git add --all</pre>
 
 
 
</div>
 
 
 
</div>
 
然后将你当前版本(包含有你修改的内容)的拷贝和你最初在教程中取出的版本对比:
 
 
 
<div class="highlight-console notranslate">
 
  
<div class="highlight">
+
现在是时候检查我们的补丁中所做的所有更改了。 要暂存准备提交的所有更改,请运行:
  
<pre>$ git diff --cached</pre>
+
然后显示您当前的 Django 副本(带有您的更改)与您在本教程前面最初签出的修订版之间的差异:
  
</div>
+
使用箭头键上下移动。
 
 
</div>
 
使用方向键上下移动
 
  
 
<div class="highlight-diff notranslate">
 
<div class="highlight-diff notranslate">
第494行: 第396行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>diff --git a/django/shortcuts.py b/django/shortcuts.py
+
<syntaxhighlight lang="diff">diff --git a/django/shortcuts.py b/django/shortcuts.py
 
index 7ab1df0e9d..8dde9e28d9 100644
 
index 7ab1df0e9d..8dde9e28d9 100644
 
--- a/django/shortcuts.py
 
--- a/django/shortcuts.py
第529行: 第431行:
 
         my_objects = list(MyModel.objects.filter(published=True))
 
         my_objects = list(MyModel.objects.filter(published=True))
 
         if not my_objects:
 
         if not my_objects:
             raise Http404(&quot;No MyModel matches the given query.&quot;)
+
             raise Http404("No MyModel matches the given query.")
 
+
 
+
 
+``make_toast()``
 
+``make_toast()``
第551行: 第453行:
 
+class MakeToastTests(SimpleTestCase):
 
+class MakeToastTests(SimpleTestCase):
 
+    def test_make_toast(self):
 
+    def test_make_toast(self):
+        self.assertEqual(make_toast(), 'toast')</pre>
+
+        self.assertEqual(make_toast(), 'toast')</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
当你检查完补丁后,敲击 <code>q</code> 键返回到命令行。如果补丁内容看起来没问题,可以提交这些修改了。
+
预览完补丁后,按 <code>q</code> 键返回命令行。 如果补丁的内容看起来没问题,就该提交更改了。
  
  
第562行: 第464行:
 
<div id="committing-the-changes-in-the-patch" class="section">
 
<div id="committing-the-changes-in-the-patch" class="section">
  
== 提交补丁中的修改 ==
+
== 提交补丁中的更改 ==
 
 
为了提交这些修改:
 
 
 
<div class="highlight-console notranslate">
 
  
<div class="highlight">
+
要提交更改:
  
<pre>$ git commit</pre>
+
这将打开一个文本编辑器来输入提交消息。 遵循 [[../../internals/contributing/committing-code#committing-guidelines|提交消息指南]] 并编写如下消息:
 
 
</div>
 
 
 
</div>
 
这会打开文本编辑器以便输入提交信息。参考 [[../../internals/contributing/committing-code#committing-guidelines|<span class="std std-ref">commit message guidelines</span>]] 输入类似这样的信息:
 
  
 
<div class="highlight-text notranslate">
 
<div class="highlight-text notranslate">
第581行: 第474行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>Fixed #99999 -- Added a shortcut function to make toast.</pre>
+
<syntaxhighlight lang="text">Fixed #99999 -- Added a shortcut function to make toast.</syntaxhighlight>
  
 
</div>
 
</div>
第590行: 第483行:
 
<div id="pushing-the-commit-and-making-a-pull-request" class="section">
 
<div id="pushing-the-commit-and-making-a-pull-request" class="section">
  
== 推送这次提交并生成一个 pull 请求 ==
+
== 推送提交并发出拉取请求 ==
  
在提交这次的修改之后,将其发送到你在GitHub上的分支(如果你使用的名称不是&quot;ticket_99999&quot;,用你自己的分支的名称取代它 ):
+
提交补丁后,将其发送到您在 GitHub 上的分支(如果不同,请将“ticket_99999”替换为您的分支名称):
  
<div class="highlight-console notranslate">
+
您可以通过访问 [https://github.com/django/django/ Django GitHub 页面] 创建拉取请求。 您将在“您最近推送的分支”下看到您的分支。 单击旁边的“比较和拉取请求”。
  
<div class="highlight">
+
请不要在本教程中执行此操作,但在显示补丁预览的下一页上,您将单击“创建拉取请求”。
 
 
<pre>$ git push origin ticket_99999</pre>
 
 
 
</div>
 
 
 
</div>
 
你可以访问 [https://github.com/django/django/ Django GitHub page] 创建一个 pull 请求。 你会在“你最近推送的分支”下看到你的分支。 单击旁边的 &quot;Compare &amp; pull request&quot;。
 
 
 
本教程中请不要这么做。不过,在接下来显示补丁预览的页面,你可以单击 &quot;Create pull request&quot;。
 
  
  
第611行: 第495行:
 
<div id="next-steps" class="section">
 
<div id="next-steps" class="section">
  
== 下一步 ==
+
== 后续步骤 ==
  
恭喜,你已经学会了如何为 Django 创建 pull request!如需获知更多高级技巧,参考 [[../../internals/contributing/writing-code/working-with-git|<span class="doc">Working with Git and GitHub</span>]]
+
恭喜,您已经学会了如何向 Django 发出拉取请求! 您可能需要的更高级技术的详细信息在 [[../../internals/contributing/writing-code/working-with-git|使用 Git GitHub]] 中。
  
现在你可以活用这些技能帮助改善 Django 的代码库。
+
现在,您可以通过帮助改进 Django 的代码库来充分利用这些技能。
  
 
<div id="more-information-for-new-contributors" class="section">
 
<div id="more-information-for-new-contributors" class="section">
  
=== 针对新贡献者的更多注意事项 ===
+
=== 新贡献者的更多信息 ===
  
在你开始为 Django 编写补丁时,这里有些信息,你应该看一看:
+
在您开始为 Django 编写补丁之前,您可能应该查看更多有关贡献的信息:
  
* 确保你阅读了 Django 的参考文档 [[../../internals/contributing/writing-code/submitting-patches|<span class="doc">创建工单和提交补丁</span>]]。它涵盖了Trac 规则,如何创建自己的工单,补丁期望的代码风格和其他一些重要信息。
+
* 您应该确保阅读关于 [[../../internals/contributing/writing-code/submitting-patches|申领门票和提交补丁]] 的 Django 文档。 它涵盖了 Trac 礼仪、如何为自己索取票证、补丁的预期编码风格以及许多其他重要细节。
* 初次提交补丁应额外阅读 [[../../internals/contributing/new-contributors|<span class="doc">首次贡献者文档</span>]]。这里有很多对新手贡献者的建议。
+
* 首次贡献者还应阅读 Django 的 [[../../internals/contributing/new-contributors|首次贡献者]] 文档。 它为我们这些刚开始帮助 Django 的人提供了很多很好的建议。
* 接下来,如果你渴望更多关于为 Django 做贡献的信息,可以阅读余下的文档 [[../../internals/contributing/index|<span class="doc">为 Django 文档上作出贡献</span>]]。它包含了大量的有用信息,这里可以解决你可能遇到的所有问题。
+
* 在这些之后,如果您仍然渴望获得更多关于贡献的信息,您可以随时浏览 [[../../internals/contributing/index|Django 关于贡献]] 的文档的其余部分。 它包含大量有用的信息,应该是您回答任何问题的第一个来源。
  
  
第631行: 第515行:
 
<div id="finding-your-first-real-ticket" class="section">
 
<div id="finding-your-first-real-ticket" class="section">
  
=== 寻找你的第一个真正意义上的工单 ===
+
=== 寻找你的第一张真正的票 ===
  
一旦你看过了之前那些信息,你便已经具备了走出困境,编写修复自己找到的工单的补丁的能力。对于那些有着“容易获得”标准的工单要尤其注意。这些工单实际上常常很简单而且对于第一次撰写补丁的人很有帮助。一旦你熟悉了给 Django 写补丁,你就可以进一步为更难且更复杂的工单写补丁。
+
一旦您浏览了其中的一些信息,您就可以准备出去寻找一张属于您自己的票来为其编写补丁。 特别注意具有“容易挑选”标准的门票。 这些票在本质上通常要简单得多,非常适合第一次投稿的人。 一旦您熟悉了为 Django 做贡献,您就可以继续为更困难和更复杂的票证编写补丁。
  
如果你只是想要简单的了解(没人会因此责备你!),那么你可以试着看看 [[#id11|<span id="id17" class="problematic">`easy tickets that need patches`__</span>]] [[#id11|<span id="id18" class="problematic">`easy tickets that have patches which need improvement`__</span>]]。如果你比较擅长写测试,那么你也可以看看这个 [[#id11|<span id="id19" class="problematic">`easy tickets that need tests`__</span>]]。一定要记得遵循在 Django 的文档声明标签和递交补丁中提到的关于声明标签的指导规则 [[../../internals/contributing/writing-code/submitting-patches|<span class="doc">声明标签和提交补丁</span>]].
+
如果您只是想开始(没有人会责怪您!),请尝试查看需要补丁的 [https://code.djangoproject.com/query?status=new&status=reopened&has_patch=0&easy=1&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority easy 票证列表] 和需要改进的补丁的 easy 票证列表[ X209X]。 如果你熟悉编写测试,你还可以查看[https://code.djangoproject.com/query?status=new&status=reopened&needs_tests=1&easy=1&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority 需要测试的简单票据列表]。 请记住遵循有关 [[../../internals/contributing/writing-code/submitting-patches|申领门票和提交补丁]] 的 Django 文档链接中提到的申领门票指南。
  
  
第641行: 第525行:
 
<div id="what-s-next-after-creating-a-pull-request" class="section">
 
<div id="what-s-next-after-creating-a-pull-request" class="section">
  
=== 创建完 pull request,下一步做什么呢? ===
+
=== 创建拉取请求后下一步是什么? ===
 +
 
 +
一张票打上补丁后,需要经过第二组眼睛的审核。 提交拉取请求后,通过在票证上设置标志来更新票证元数据,例如“有补丁”、“不需要测试”等,以便其他人可以找到它进行审查。 贡献并不总是意味着从头开始编写补丁。 查看现有补丁也是一个非常有用的贡献。 有关详细信息,请参阅 [[../../internals/contributing/triaging-tickets|分类票证]] 。
  
工单有了补丁后,需要他人来复审。提交 pull 请求后,为工单打上如“有补丁”,“无需测试”之类的标签,如此他人便可查找到该工单以便复审。从头开始编写补丁固然是贡献的一种方式,但复审已有补丁同样能帮助 Django。 查看 [[../../internals/contributing/triaging-tickets|<span class="doc">Triaging tickets</span>]] 了解更多。
 
  
 +
</div>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
 +
<div class="clearer">
 +
 +
  
 
</div>
 
</div>
  
[[Category:Django 3.0.x 中文文档]]
+
[[Category:Django 3.0.x 文档]]

2021年10月31日 (日) 04:08的最新版本

为 Django 编写你的第一个补丁

简介

有兴趣回馈社区吗? 也许您在 Django 中发现了一个您希望修复的错误,或者您想要添加一个小功能。

回馈 Django 本身是解决您自己的问题的最佳方式。 乍一看,这似乎令人生畏,但它是一条经过广泛探索的路径,其中包含文档、工具和支持您的社区。 我们将引导您完成整个过程,以便您可以通过示例进行学习。

这个教程是给谁看的?

也可以看看

如果您正在寻找有关如何提交补丁的参考,请参阅 提交补丁 文档。


对于本教程,我们希望您至少对 Django 的工作原理有基本的了解。 这意味着您应该可以轻松浏览有关 编写第一个 Django 应用程序 的现有教程。 此外,您应该对 Python 本身有很好的了解。 但如果你不这样做,深入 Python 是一本非常棒的(免费的)在线书籍,适合 Python 初学者。

那些不熟悉版本控制系统和 Trac 的人会发现本教程及其链接包含的信息刚好足以开始使用。 但是,如果您计划定期为 Django 做出贡献,您可能需要阅读更多有关这些不同工具的信息。

不过,在大多数情况下,本教程尝试尽可能多地进行解释,以便对最广泛的受众有用。

从哪里获得帮助:

如果您在阅读本教程时遇到问题,请向 django-developers 发消息或访问 irc.freenode.net 上的 #django-dev 与其他 Django 用户聊天谁能帮忙。


本教程涵盖哪些内容?

我们将引导您第一次向 Django 贡献补丁。 在本教程结束时,您应该对所涉及的工具和流程有基本的了解。 具体来说,我们将涵盖以下内容:

  • 安装 Git。
  • 下载 Django 开发版本的副本。
  • 运行 Django 的测试套件。
  • 为您的补丁编写测试。
  • 为您的补丁编写代码。
  • 测试您的补丁。
  • 提交拉取请求。
  • 在哪里寻找更多信息。

完成本教程后,您可以查看 Django 中关于贡献 的文档的其余部分。 它包含许多重要信息,是任何想成为 Django 定期贡献者的人的必读之物。 如果你有问题,它可能有答案。

需要 Python 3!

当前版本的 Django 不支持 Python 2.7。 在 Python 的下载页面 或使用操作系统的包管理器获取 Python 3。


对于 Windows 用户

有关其他指导,请参阅 Windows 文档上的 Install Python


行为准则

作为贡献者,您可以帮助我们保持 Django 社区的开放性和包容性。 请阅读并遵守我们的 行为准则


安装 Git

对于本教程,您需要安装 Git 来下载 Django 的当前开发版本并为您所做的更改生成补丁文件。

要检查您是否安装了 Git,请在命令行中输入 git。 如果您收到消息说找不到此命令,则必须下载并安装它,请参阅 Git 的下载页面

如果您不太熟悉 Git,您总是可以通过在命令行中输入 git help 来了解有关其命令的更多信息(安装后)。


获取 Django 开发版本的副本

为 Django 做出贡献的第一步是获取源代码的副本。 首先, 在 GitHub 上 fork Django。 然后,从命令行,使用 cd 命令导航到您希望 Django 的本地副本所在的目录。

使用以下命令下载 Django 源代码库:

低带宽连接?

您可以将 --depth 1 参数添加到 git clone 以跳过下载所有 Django 的提交历史记录,从而将数据传输从 ~250 MB 减少到 ~70 MB。


现在您有了 Django 的本地副本,您可以像使用 pip 安装任何软件包一样安装它。 最方便的方法是使用 虚拟环境 ,这是 Python 内置的一项功能,允许您为每个项目保留一个单独的已安装包目录,以便它们不会干扰彼此。

将所有虚拟环境保存在一个地方是一个好主意,例如在您的主目录中的 .virtualenvs/ 中。

通过运行创建一个新的虚拟环境:

该路径是新环境将在您的计算机上保存的位置。

设置虚拟环境的最后一步是激活它:

$ source ~/.virtualenvs/djangodev/bin/activate

如果 source 命令不可用,您可以尝试使用点代替:

$ . ~/.virtualenvs/djangodev/bin/activate

每当您打开新的终端窗口时,您都必须激活虚拟环境。

对于 Windows 用户

要在 Windows 上激活您的虚拟环境,请运行:

...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat

当前激活的虚拟环境的名称显示在命令行上,以帮助您跟踪正在使用的虚拟环境。 在显示此名称时通过 pip 安装的任何内容都将安装在该虚拟环境中,与其他环境和系统范围的软件包隔离。

继续安装之前克隆的 Django 副本:

通过以可编辑模式安装,已安装的 Django 版本现在指向您的本地副本。 您将立即看到对其所做的任何更改,这在编写第一个补丁时非常有帮助。

使用 Django 的本地副本创建项目

使用 Django 项目测试您的本地更改可能会有所帮助。 首先,您必须创建一个新的虚拟环境, 以可编辑模式 安装先前克隆的 Django 本地副本,并在您的 Django 本地副本之外创建一个新的 Django 项目。 您将立即在新项目中看到对 Django 所做的任何更改,这在编写第一个补丁时很有帮助。


第一次运行 Django 的测试套件

在为 Django 做出贡献时,重要的是您的代码更改不会将错误引入 Django 的其他领域。 在您进行更改后检查 Django 是否仍然有效的一种方法是运行 Django 的测试套件。 如果所有测试仍然通过,那么您可以合理地确定您的更改有效并且没有破坏 Django 的其他部分。 如果您以前从未运行过 Django 的测试套件,最好事先运行一次以熟悉其输出。

在运行测试套件之前,通过 cd-ing 将其依赖项安装到 Django tests/ 目录中,然后运行:

如果您在安装过程中遇到错误,您的系统可能缺少一个或多个 Python 包的依赖项。 查阅失败包的文档或使用您遇到的错误消息在 Web 上搜索。

现在我们准备运行测试套件。 如果您使用的是 GNU/Linux、macOS 或其他一些 Unix 版本,请运行:

现在坐下来放松一下。 Django 的整个测试套件有数千个测试,运行至少需要几分钟,具体取决于您的计算机速度。

当 Django 的测试套件运行时,您会看到一个字符流,代表每个测试完成时的状态。 E 表示测试期间出现错误,F 表示测试断言失败。 这两个都被认为是测试失败。 同时,xs 分别表示预期失败和跳过测试。 点表示通过测试。

跳过测试通常是由于缺少运行测试所需的外部库; 请参阅 运行所有测试 以获取依赖项列表,并确保为与您所做更改相关的测试安装任何测试(本教程不需要任何测试)。 某些测试特定于特定的数据库后端,如果不使用该后端进行测试,将被跳过。 SQLite 是默认设置的数据库后端。 要使用不同的后端运行测试,请参阅 使用另一个设置模块

测试完成后,您应该会收到一条消息,通知您测试套件是通过还是失败。 由于您尚未对 Django 的代码进行任何更改,因此整个测试套件 应该 通过。 如果您遇到失败或错误,请确保您已正确执行所有前面的步骤。 有关更多信息,请参阅 运行单元测试

请注意,最新的 Django master 可能并不总是稳定的。 在针对 master 开发时,您可以检查 Django 的持续集成构建 以确定故障是否特定于您的机器,或者它们是否也存在于 Django 的官方构建中。 如果单击查看特定构建,则可以查看“配置矩阵”,其中显示了按 Python 版本和数据库后端细分的故障。

笔记

对于本教程和我们正在处理的票证,针对 SQLite 进行测试就足够了,但是,可以(有时需要) 使用不同的数据库 运行测试。


处理功能

在本教程中,我们将使用“假票”作为案例研究。 以下是想象中的细节:

票号 #99999 – 允许烤面包

Django 应该提供一个返回 'toast' 的函数 django.shortcuts.make_toast()


我们现在将实现此功能和相关测试。


为您的补丁创建一个分支

在进行任何更改之前,为票证创建一个新分支:

您可以为分支选择任何您想要的名称,例如“ticket_99999”。 在此分支中所做的所有更改都将特定于票证,不会影响我们之前克隆的代码的主副本。


为您的机票编写一些测试

在大多数情况下,要让 Django 接受补丁,它必须包含测试。 对于错误修复补丁,这意味着编写回归测试以确保该错误以后永远不会重新引入 Django。 回归测试应该以这样的方式编写,即在错误仍然存在时它会失败并在错误被修复后通过。 对于包含新功能的补丁,您需要包括确保新功能正常工作的测试。 当新功能不存在时,它们也应该失败,然后在实现后通过。

这样做的一个好方法是先编写新测试,然后再对代码进行任何更改。 这种开发风格称为测试驱动开发,可以应用于整个项目和单个补丁。 编写测试后,然后运行它们以确保它们确实失败(因为您尚未修复该错误或添加该功能)。 如果您的新测试没有失败,您将需要修复它们以便它们成功。 毕竟,无论是否存在错误都通过的回归测试对于防止该错误再次发生并没有多大帮助。

现在是我们的动手示例。

为票证编写测试 #99999

为了解决这个问题,我们将在顶层 django 模块中添加一个 make_toast() 函数。 首先,我们将编写一个测试,尝试使用该函数并检查其输出是否正确。

导航到 Django 的 tests/shortcuts/ 文件夹并创建一个新文件 test_make_toast.py。 添加以下代码:

from django.shortcuts import make_toast
from django.test import SimpleTestCase


class MakeToastTests(SimpleTestCase):
    def test_make_toast(self):
        self.assertEqual(make_toast(), 'toast')

此测试检查 make_toast() 是否返回 'toast'

但是这个测试的东西看起来有点难……

如果您以前从未处理过测试,那么乍一看它们可能看起来有点难以编写。 幸运的是,测试是计算机编程中一个 非常 的大主题,因此有很多信息:

  • 可以在 编写和运行测试 的文档中找到有关为 Django 编写测试的初步了解。
  • Dive Into Python(一本面向 Python 初学者的免费在线书籍)包括对单元测试 的精彩介绍
  • 阅读完这些之后,如果您想要更深入地了解一些内容,总有 Python unittest 文档。


运行你的新测试

由于我们还没有对 django.shortcuts 进行任何修改,我们的测试应该会失败。 让我们运行 shortcuts 文件夹中的所有测试,以确保这确实发生了。 cd 到 Django tests/ 目录并运行:

如果测试运行正确,您应该会看到一个与我们添加的测试方法相对应的失败,并显示以下错误:

ImportError: cannot import name 'make_toast' from 'django.shortcuts'

如果所有测试都通过了,那么您需要确保将上面显示的新测试添加到适当的文件夹和文件名中。


为您的机票编写代码

接下来我们将添加 make_toast() 函数。

导航到 django/ 文件夹并打开 shortcuts.py 文件。 在底部添加:

def make_toast():
    return 'toast'

现在我们需要确保我们之前编写的测试通过,以便我们可以查看我们添加的代码是否正常工作。 再次导航到 Django tests/ 目录并运行:

一切都应该过去。 如果没有,请确保您将函数正确添加到正确的文件中。


第二次运行 Django 的测试套件

一旦您确认您的补丁和您的测试工作正常,最好运行整个 Django 测试套件以验证您的更改没有将任何错误引入 Django 的其他区域。 虽然成功通过整个测试套件并不能保证您的代码没有错误,但它确实有助于识别许多否则可能会被忽视的错误和回归。

要运行整个 Django 测试套件,cd 进入 Django tests/ 目录并运行:


编写文档

这是一个新功能,所以应该记录下来。 打开文件 docs/topics/http/shortcuts.txt 并在文件末尾添加以下内容:

``make_toast()``
================

.. versionadded:: 2.2

Returns ``'toast'``.

由于此新功能将在即将发布的版本中出现,因此它也被添加到下一版 Django 的发行说明中。 在 docs/releases/ 中打开最新版本的发行说明,在撰写本文时为 2.2.txt。 在“次要功能”标题下添加注释:

:mod:`django.shortcuts`
~~~~~~~~~~~~~~~~~~~~~~~

* The new :func:`django.shortcuts.make_toast` function returns ``'toast'``.

有关编写文档的更多信息,包括对 versionadded 位的全部内容的解释,请参阅 编写文档 。 该页面还包括如何在本地构建文档副本的说明,以便您可以预览将生成的 HTML。


预览您的更改

现在是时候检查我们的补丁中所做的所有更改了。 要暂存准备提交的所有更改,请运行:

然后显示您当前的 Django 副本(带有您的更改)与您在本教程前面最初签出的修订版之间的差异:

使用箭头键上下移动。

diff --git a/django/shortcuts.py b/django/shortcuts.py
index 7ab1df0e9d..8dde9e28d9 100644
--- a/django/shortcuts.py
+++ b/django/shortcuts.py
@@ -156,3 +156,7 @@ def resolve_url(to, *args, **kwargs):

     # Finally, fall back and assume it's a URL
     return to
+
+
+def make_toast():
+    return 'toast'
diff --git a/docs/releases/2.2.txt b/docs/releases/2.2.txt
index 7d85d30c4a..81518187b3 100644
--- a/docs/releases/2.2.txt
+++ b/docs/releases/2.2.txt
@@ -40,6 +40,11 @@ database constraints. Constraints are added to models using the
 Minor features
 --------------

+:mod:`django.shortcuts`
+~~~~~~~~~~~~~~~~~~~~~~~
+
+* The new :func:`django.shortcuts.make_toast` function returns ``'toast'``.
+
 :mod:`django.contrib.admin`
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~

diff --git a/docs/topics/http/shortcuts.txt b/docs/topics/http/shortcuts.txt
index 7b3a3a2c00..711bf6bb6d 100644
--- a/docs/topics/http/shortcuts.txt
+++ b/docs/topics/http/shortcuts.txt
@@ -271,3 +271,12 @@ This example is equivalent to::
         my_objects = list(MyModel.objects.filter(published=True))
         if not my_objects:
             raise Http404("No MyModel matches the given query.")
+
+``make_toast()``
+================
+
+.. function:: make_toast()
+
+.. versionadded:: 2.2
+
+Returns ``'toast'``.
diff --git a/tests/shortcuts/test_make_toast.py b/tests/shortcuts/test_make_toast.py
new file mode 100644
index 0000000000..6f4c627b6e
--- /dev/null
+++ b/tests/shortcuts/test_make_toast.py
@@ -0,0 +1,7 @@
+from django.shortcuts import make_toast
+from django.test import SimpleTestCase
+
+
+class MakeToastTests(SimpleTestCase):
+    def test_make_toast(self):
+        self.assertEqual(make_toast(), 'toast')

预览完补丁后,按 q 键返回命令行。 如果补丁的内容看起来没问题,就该提交更改了。


提交补丁中的更改

要提交更改:

这将打开一个文本编辑器来输入提交消息。 遵循 提交消息指南 并编写如下消息:

Fixed #99999 -- Added a shortcut function to make toast.

推送提交并发出拉取请求

提交补丁后,将其发送到您在 GitHub 上的分支(如果不同,请将“ticket_99999”替换为您的分支名称):

您可以通过访问 Django GitHub 页面 创建拉取请求。 您将在“您最近推送的分支”下看到您的分支。 单击旁边的“比较和拉取请求”。

请不要在本教程中执行此操作,但在显示补丁预览的下一页上,您将单击“创建拉取请求”。


后续步骤

恭喜,您已经学会了如何向 Django 发出拉取请求! 您可能需要的更高级技术的详细信息在 使用 Git 和 GitHub 中。

现在,您可以通过帮助改进 Django 的代码库来充分利用这些技能。

新贡献者的更多信息

在您开始为 Django 编写补丁之前,您可能应该查看更多有关贡献的信息:

  • 您应该确保阅读关于 申领门票和提交补丁 的 Django 文档。 它涵盖了 Trac 礼仪、如何为自己索取票证、补丁的预期编码风格以及许多其他重要细节。
  • 首次贡献者还应阅读 Django 的 首次贡献者 文档。 它为我们这些刚开始帮助 Django 的人提供了很多很好的建议。
  • 在这些之后,如果您仍然渴望获得更多关于贡献的信息,您可以随时浏览 Django 关于贡献 的文档的其余部分。 它包含大量有用的信息,应该是您回答任何问题的第一个来源。


寻找你的第一张真正的票

一旦您浏览了其中的一些信息,您就可以准备出去寻找一张属于您自己的票来为其编写补丁。 特别注意具有“容易挑选”标准的门票。 这些票在本质上通常要简单得多,非常适合第一次投稿的人。 一旦您熟悉了为 Django 做贡献,您就可以继续为更困难和更复杂的票证编写补丁。

如果您只是想开始(没有人会责怪您!),请尝试查看需要补丁的 easy 票证列表 和需要改进的补丁的 easy 票证列表[ X209X]。 如果你熟悉编写测试,你还可以查看需要测试的简单票据列表。 请记住遵循有关 申领门票和提交补丁 的 Django 文档链接中提到的申领门票指南。


创建拉取请求后下一步是什么?

一张票打上补丁后,需要经过第二组眼睛的审核。 提交拉取请求后,通过在票证上设置标志来更新票证元数据,例如“有补丁”、“不需要测试”等,以便其他人可以找到它进行审查。 贡献并不总是意味着从头开始编写补丁。 查看现有补丁也是一个非常有用的贡献。 有关详细信息,请参阅 分类票证