{"title":"将你的应用从 Django 0.96 移植到 1.0","version":"5.2","locale":"zh-hans","docname":"releases/1.0-porting-guide","url":"/zh-hans/5.2/releases/1.0-porting-guide/","canonical":"https://djangodocs.dev/zh-hans/5.2/releases/1.0-porting-guide/","summary":"Django 1.0 在某些地方与 0.96 版本是不兼容的。 这个指南会帮助你把 0.96 的项目和应用移植到 1.0 版本。本文档的第一部分包含了需要运行在 1.0上的常见变更。如果通过了第一部分的变更，你的代码依然无法运行，那么请检查 Less-common Changes 不常见的变更部分中列出的兼容问题。 See…","html":"<h1>将你的应用从 Django 0.96 移植到 1.0<a class=\"heading-anchor\" href=\"#porting-your-apps-from-django-0-96-to-1-0\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 1.0 在某些地方与 0.96 版本是不兼容的。</p>\n<p>这个指南会帮助你把 0.96 的项目和应用移植到 1.0 版本。本文档的第一部分包含了需要运行在 1.0上的常见变更。如果通过了第一部分的变更，你的代码依然无法运行，那么请检查 <a class=\"reference internal\" href=\"#less-common-changes\">Less-common Changes</a> 不常见的变更部分中列出的兼容问题。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>文档 <a class=\"reference internal\" href=\"/zh-hans/5.2/releases/1.0/\"><span class=\"doc\">1.0 版本注意事项</span></a>。这份文档更深入地解释了 1.0 中新的特性；移植指南更多考虑了帮助你快速更新你的代码。</p>\n</aside>\n<section id=\"common-changes\">\n<h2>常见变更<a class=\"heading-anchor\" href=\"#common-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>本部分描述了 0.96 与 1.0 之间的变更，这些变更都是大部分用户会做的事情。</p>\n<section id=\"use-unicode\">\n<h3>使用 Unicode 字符集<a class=\"heading-anchor\" href=\"#use-unicode\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>逐字地把字符串 (<code class=\"docutils literal notranslate\"><span class=\"pre\">'foo'</span></code>) 变成 Unicode 字符串 (<code class=\"docutils literal notranslate\"><span class=\"pre\">u'foo'</span></code>)。Django 目前从始至终贯穿地使用 Unicode 字符集字符串。在绝大多数地方，生食字符串会继续有效，但更新成 Unicode 字符串会防止某些含糊的问题出现。</p>\n<p>查阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/unicode/\"><span class=\"doc\">Unicode 数据</span></a> 文档了解细节。</p>\n</section>\n<section id=\"models\">\n<h3>模型<a class=\"heading-anchor\" href=\"#models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>对于你的模型文件中常见的变更：</p>\n<section id=\"rename-maxlength-to-max-length\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">maxlength</span></code> 重命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code><a class=\"heading-anchor\" href=\"#rename-maxlength-to-max-length\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>把你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">maxlength</span></code> 参数名变成 <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> (这次参数名的变更是为了与表单区域保持一致)：</p>\n</section>\n<section id=\"replace-str-with-unicode\">\n<h4>用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__</span></code> 代替 <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__</span></code><a class=\"heading-anchor\" href=\"#replace-str-with-unicode\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">__unicode__</span></code> 方法替换你的模型中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__</span></code> 函数，然后才能确保你使用 <a class=\"reference internal\" href=\"#use-unicode\">使用 Unicode 字符集</a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">u'foo'</span></code>) 中所介绍的方法。</p>\n</section>\n<section id=\"remove-prepopulated-from\">\n<h4>移除 <code class=\"docutils literal notranslate\"><span class=\"pre\">prepopulated_from</span></code><a class=\"heading-anchor\" href=\"#remove-prepopulated-from\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>删除模型区域中 <code class=\"docutils literal notranslate\"><span class=\"pre\">prepopulated_from</span></code> 参数。这个参数不再合法，而且已经转移到管理员 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 模块里的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code> 类中去了。查阅 <a class=\"reference internal\" href=\"#the-admin\">管理员</a> 内容了解更多对管理员变更的细节。</p>\n</section>\n<section id=\"remove-core\">\n<h4>移除 <code class=\"docutils literal notranslate\"><span class=\"pre\">core</span></code><a class=\"heading-anchor\" href=\"#remove-core\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>删除你的模型区域里的 <code class=\"docutils literal notranslate\"><span class=\"pre\">core</span></code> 参数。这个参数不再需要了，因为相同功能 (参考 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/admin/#admin-inlines\"><span class=\"std std-ref\">行内编辑</span></a>) 目前已经由后台接口做出不同地处理。你不用再担心行内编辑，除非你在 <a class=\"reference internal\" href=\"#the-admin\">管理员</a> 部分才考虑行内编辑。目前，删除所有对 <code class=\"docutils literal notranslate\"><span class=\"pre\">core</span></code> 参数的指向。</p>\n</section>\n<section id=\"replace-class-admin-with-admin-py\">\n<h4>用 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 替换  <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Admin:</span></code><a class=\"heading-anchor\" href=\"#replace-class-admin-with-admin-py\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>从你的模型里移除所有嵌入 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Admin</span></code> 管理员类声明。如果你保留这种类的话，不会对任何有影响，但也不会起任何作用。要注册应用程序管理员，你要把这种类的声明移到 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 管理员模块文件里；查看 <a class=\"reference internal\" href=\"#the-admin\">管理员</a> 内容了解更多细节。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<p>对 <a class=\"reference external\" href=\"https://djangosnippets.org/\">djangosnippets</a> 做出的贡献者已经写了一个脚本会 <a class=\"reference external\" href=\"https://djangosnippets.org/snippets/603/\">扫描你的 models.py 模型模块后生成一个相应的 admin.py 管理员模块</a>。</p>\n</aside>\n</section>\n<section id=\"example\">\n<h4>例如<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>下面的一个例子 <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> 模型文件含有所有你需要做出的变更：</p>\n<p>老版本 (0.96) <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">maxlength</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">maxlength</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    <span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">maxlength</span><span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"p\">,</span> <span class=\"n\">prepopulate_from</span><span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">))</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Admin</span><span class=\"p\">:</span>\n        <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0) <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Author</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">30</span><span class=\"p\">)</span>\n    <span class=\"n\">slug</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">60</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">__unicode__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0) <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 管理员模块：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Author</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthorAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">list_display</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">]</span>\n    <span class=\"n\">prepopulated_fields</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">)}</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Author</span><span class=\"p\">,</span> <span class=\"n\">AuthorAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-admin\">\n<h3>管理员<a class=\"heading-anchor\" href=\"#the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在 1.0 版本中最具挑战性的新管理员功能问题之一。Django 管理接口 (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code>) 管理员功能已经完全重构了；许多管理员定义目前都完全从许多模型定义中解构出来，许多框架都重写后使用 Django 的新表单处理库，而且重新设计成具有扩展和自定义能力。</p>\n<p>实际中，意味着你要重写所有你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Admin</span></code> 管理员类声明。你已经在上面的 <a class=\"reference internal\" href=\"#models\">models</a> 中见过了如何替换你的 <code class=\"docutils literal notranslate\"><span class=\"pre\">class</span> <span class=\"pre\">Admin</span></code> 管理员类，就是在 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 管理员模块文件中用一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.site.register()</span></code> 管理员网页注册调用来替代。下面这些都是一些更详细的如何重写 <code class=\"docutils literal notranslate\"><span class=\"pre\">Admin</span></code> 管理员声明类的新句法。</p>\n<section id=\"use-new-inline-syntax\">\n<h4>使用新的行内句法<a class=\"heading-anchor\" href=\"#use-new-inline-syntax\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">edit_inline</span></code> 行内编辑选项都已经移到 <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> 管理员模块中了。下面有一个例子：</p>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Parent</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Child</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">parent</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Parent</span><span class=\"p\">,</span> <span class=\"n\">edit_inline</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">STACKED</span><span class=\"p\">,</span> <span class=\"n\">num_in_admin</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ChildInline</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">StackedInline</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Child</span>\n    <span class=\"n\">extra</span> <span class=\"o\">=</span> <span class=\"mi\">3</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ParentAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">Parent</span>\n    <span class=\"n\">inlines</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ChildInline</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">Parent</span><span class=\"p\">,</span> <span class=\"n\">ParentAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>查阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/admin/#admin-inlines\"><span class=\"std std-ref\">InlineModelAdmin 对象</span></a> 管理员行内文档了解更多细节。</p>\n</section>\n<section id=\"simplify-fields-or-use-fieldsets\">\n<h4>简化 <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code>，或使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code><a class=\"heading-anchor\" href=\"#simplify-fields-or-use-fieldsets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>老的 <code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code> 句法是非常迷糊的，而且已经被简化过。老的句法依然有效，但你要使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">fieldsets</span></code> 来代替老旧句法。</p>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ModelOne</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Admin</span><span class=\"p\">:</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">((</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">)}),)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ModelTwo</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Admin</span><span class=\"p\">:</span>\n        <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;group1&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">}),</span>\n            <span class=\"p\">(</span><span class=\"s2\">&quot;group2&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;spam&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;eggs&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;collapse wide&quot;</span><span class=\"p\">}),</span>\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ModelOneAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fields</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ModelTwoAdmin</span><span class=\"p\">(</span><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">ModelAdmin</span><span class=\"p\">):</span>\n    <span class=\"n\">fieldsets</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;group1&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;foo&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;bar&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;collapse&quot;</span><span class=\"p\">}),</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;group2&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;fields&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"s2\">&quot;spam&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;eggs&quot;</span><span class=\"p\">),</span> <span class=\"s2\">&quot;classes&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;collapse wide&quot;</span><span class=\"p\">}),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">See also</p>\n<ul class=\"simple\">\n<li><p>更多关于变更的详细信息以及背后的原因都可以在 <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/NewformsAdminBranch\">NewformsAdminBranch wiki page</a> 新表单管理分支维基百科页面找到</p></li>\n<li><p>新的管理员功能伴随着许多新特性；你可以在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/admin/\"><span class=\"doc\">管理员文档</span></a> 中来阅读有关内容。</p></li>\n</ul>\n</aside>\n</section>\n</section>\n<section id=\"urls\">\n<h3>URLs<a class=\"heading-anchor\" href=\"#urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"update-your-root-urls-py\">\n<h4>更新你的根路径 <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code> 模块<a class=\"heading-anchor\" href=\"#update-your-root-urls-py\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>如果你正在使用后台界面，你需要更新你的根路径``urls.py`` 模块。</p>\n<p>老版本 (0.96) <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls.defaults</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"o\">*</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"n\">patterns</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^admin/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.contrib.admin.urls&quot;</span><span class=\"p\">)),</span>\n    <span class=\"c1\"># ... the rest of your URLs here ...</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0) <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls.defaults</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"o\">*</span>\n\n<span class=\"c1\"># The next two lines enable the admin and load each admin.py file:</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">autodiscover</span><span class=\"p\">()</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"n\">patterns</span><span class=\"p\">(</span>\n    <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s2\">&quot;^admin/(.*)&quot;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">root</span><span class=\"p\">),</span>\n    <span class=\"c1\"># ... the rest of your URLs here ...</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"views\">\n<h3>视图<a class=\"heading-anchor\" href=\"#views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"use-django-forms-instead-of-newforms\">\n<h4>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms</span></code> 来代替 <code class=\"docutils literal notranslate\"><span class=\"pre\">newforms</span></code> 用法<a class=\"heading-anchor\" href=\"#use-django-forms-instead-of-newforms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms</span></code> 来替换 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.newforms</span></code> 用法 -- Django 1.0 版本重命名了 <code class=\"docutils literal notranslate\"><span class=\"pre\">newforms</span></code> 模块名 (曾用在 0.96 版本的名字) 采用以前用过的 <code class=\"docutils literal notranslate\"><span class=\"pre\">forms</span></code> 名字。而 <code class=\"docutils literal notranslate\"><span class=\"pre\">oldforms</span></code> 模块也会被移除。</p>\n<p>如果你已经使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">newforms</span></code> 库的话，而且你采用了我们所建议的 <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span></code> 导入语句句法，那么所有你要做的就是改变一下你的导入依据即可。</p>\n<p>老版本:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">newforms</span> <span class=\"k\">as</span> <span class=\"n\">forms</span>\n</code></pre></div>\n<p>新版本:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n</code></pre></div>\n<p>如果你正在使用老的表单系统 (正规的名字是 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.forms</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.oldforms</span></code>)，那么你要重写你的表单。良好地开始就是从阅读 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/forms/\"><span class=\"doc\">表单文档</span></a> 内容</p>\n</section>\n<section id=\"handle-uploaded-files-using-the-new-api\">\n<h4>处理上传文件使用新的 API<a class=\"heading-anchor\" href=\"#handle-uploaded-files-using-the-new-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>代替上传文件的用法 -- 那就是，采用 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> 文件请求入口 -- 与含有 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile\" title=\"django.core.files.uploadedfile.UploadedFile\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code></a> 文件上传类的简单字典一样。老的字典句法不再有效了。</p>\n<p>因此，看起来就像:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">[</span><span class=\"s2\">&quot;file_field_name&quot;</span><span class=\"p\">]</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>...你需要做出如下变更：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>老版本 (0.96)</p></th>\n<th class=\"head\"><p>新版本 (1.0)</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f['content']</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f.read()</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f['filename']</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f.name</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f['content-type']</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">f.content_type</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"work-with-file-fields-using-the-new-api\">\n<h4>文件字段使用新API处理<a class=\"heading-anchor\" href=\"#work-with-file-fields-using-the-new-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>class:django.db.models.FileField 的内部实现已更改。一个明显的结果是您访问特殊属性(URL, filename, image size, 等等)的方式发生了变化。您需要进行以下更改，假设您的模型 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> 调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">myfile</span></code>:</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>老版本 (0.96)</p></th>\n<th class=\"head\"><p>新版本 (1.0)</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.get_content_filename()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.path</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.get_content_url()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.url</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.get_content_size()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.size</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.save_content_file()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.save()</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.get_content_width()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.width</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.get_content_height()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">myfile.content.height</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>请注意 <code class=\"docutils literal notranslate\"><span class=\"pre\">width</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">height</span></code> 属性仅对:class:~django.db.models.ImageField  字段有意义。更多详细信息可以在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/models/fields/\"><span class=\"doc\">模型 API</span></a> 文档中找到。</p>\n</section>\n<section id=\"use-paginator-instead-of-objectpaginator\">\n<h4>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Paginator</span></code> 而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">ObjectPaginator</span></code><a class=\"heading-anchor\" href=\"#use-paginator-instead-of-objectpaginator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>0.96 版本中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">ObjectPaginator</span></code> 已被删除，并替换为一个改进版本: class:django.core.paginator.Paginator。</p>\n</section>\n</section>\n<section id=\"templates\">\n<h3>模板<a class=\"heading-anchor\" href=\"#templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"learn-to-love-autoescaping\">\n<h4>学会爱上自动转义<a class=\"heading-anchor\" href=\"#learn-to-love-autoescaping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>默认情况下，模板系统现在会自动对每个变量的输出进行HTML转义。要了解更多信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/templates/language/#automatic-html-escaping\"><span class=\"std std-ref\">自动 HTML 转义</span></a>。</p>\n<p>要禁用单个变量的自动转义，请使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/templates/builtins/#std-templatefilter-safe\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">safe</span></code></a> 过滤器:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>This will be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span> <span class=\"cp\">}}</span>\nThis will not be escaped: <span class=\"cp\">{{</span> <span class=\"nv\">data</span><span class=\"o\">|</span><span class=\"nf\">safe</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n<p>要禁用整个模板的自动转义，请将模板（或模板的特定部分）包装在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/templates/builtins/#std-templatetag-autoescape\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">autoescape</span></code></a> 标签:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">autoescape</span> <span class=\"nv\">off</span> <span class=\"cp\">%}</span>\n   ... unescaped template content here ...\n<span class=\"cp\">{%</span> <span class=\"k\">endautoescape</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"less-common-changes\">\n<h2>不常见的变化<a class=\"heading-anchor\" href=\"#less-common-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>以下更改是较小的、更本地化的更改。它们应该只影响更高级的用户，但是通读列表并检查代码中的这些东西可能是值得的。</p>\n<section id=\"signals\">\n<h3>信号<a class=\"heading-anchor\" href=\"#signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<ul class=\"simple\">\n<li><p>将``**kwargs``添加到任何注册的信号处理程序中。</p></li>\n<li><p>通过 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/signals/#django.dispatch.Signal\" title=\"django.dispatch.Signal\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Signal</span></code></a> 对象上的方法连接、断开连接和发送信号，而不是通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.dispatch.dispatcher</span></code> 中的模块方法。</p></li>\n<li><p>移除任何对 <code class=\"docutils literal notranslate\"><span class=\"pre\">Anonymous</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">Any</span></code> 发送者选项的使用；它们不再存在。你仍然可以通过使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">sender=None</span></code> 接收来自任何发送者的信号。</p></li>\n<li><p>将你声明的任何自定义信号转换为 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/signals/#django.dispatch.Signal\" title=\"django.dispatch.Signal\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.dispatch.Signal</span></code></a> 的实例，而不是匿名对象。</p></li>\n</ul>\n<p>以下是你需要进行的代码更改的快速摘要：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>老版本 (0.96)</p></th>\n<th class=\"head\"><p>新版本 (1.0)</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">callback(sender)</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">def</span> <span class=\"pre\">callback(sender,</span> <span class=\"pre\">**kwargs)</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sig</span> <span class=\"pre\">=</span> <span class=\"pre\">object()</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sig</span> <span class=\"pre\">=</span> <span class=\"pre\">django.dispatch.Signal()</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">dispatcher.connect(callback,</span> <span class=\"pre\">sig)</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sig.connect(callback)</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">dispatcher.send(sig,</span> <span class=\"pre\">sender)</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sig.send(sender)</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">dispatcher.connect(callback,</span> <span class=\"pre\">sig,</span> <span class=\"pre\">sender=Any)</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sig.connect(callback,</span> <span class=\"pre\">sender=None)</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n<section id=\"comments\">\n<h3>评论<a class=\"heading-anchor\" href=\"#comments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你使用的是Django 0.96版的` Django .contrib.comments`应用程序，你需要升级到1.0版引入的新评论应用程序。详细信息请参见升级指导书。</p>\n</section>\n<section id=\"template-tags\">\n<h3>模板标签<a class=\"heading-anchor\" href=\"#template-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"spaceless-tag\">\n<h4><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/templates/builtins/#std-templatetag-spaceless\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">spaceless</span></code></a> 标签<a class=\"heading-anchor\" href=\"#spaceless-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">spaceless</span></code> 模板标签现在会移除 HTML 标签之间的 <em>所有</em> 空格，而不再保留单个空格。</p>\n</section>\n</section>\n<section id=\"local-flavors\">\n<h3>本地风味<a class=\"heading-anchor\" href=\"#local-flavors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"u-s-local-flavor\">\n<h4>美国本地风味<a class=\"heading-anchor\" href=\"#u-s-local-flavor\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.localflavor.usa</span></code> 已重命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.localflavor.us</span></code>。此更改是为了与其他本地化风格的命名方案匹配。要迁移你的代码，你只需要更改导入语句。</p>\n</section>\n</section>\n<section id=\"sessions\">\n<h3>会话<a class=\"heading-anchor\" href=\"#sessions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"getting-a-new-session-key\">\n<h4>获取新的会话密钥<a class=\"heading-anchor\" href=\"#getting-a-new-session-key\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionBase.get_new_session_key()</span></code> 已重命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">_get_new_session_key()</span></code>。<code class=\"docutils literal notranslate\"><span class=\"pre\">get_new_session_object()</span></code> 不再存在。</p>\n</section>\n</section>\n<section id=\"fixtures\">\n<h3>辅助工具<a class=\"heading-anchor\" href=\"#fixtures\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"loading-a-row-no-longer-calls-save\">\n<h4>加载一行不再调用&quot;save()&quot;<a class=\"heading-anchor\" href=\"#loading-a-row-no-longer-calls-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>以前加载一行数据会自动运行模型的`save()`方法。现在情况不再是这样了，所以任何由``save()``自动填充的字段(例如:时间戳)现在都需要在任何fixture中显示值。</p>\n</section>\n</section>\n<section id=\"settings\">\n<h3>配置<a class=\"heading-anchor\" href=\"#settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"better-exceptions\">\n<h4>更好的异常处理<a class=\"heading-anchor\" href=\"#better-exceptions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>旧的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#EnvironmentError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">EnvironmentError</span></code></a> 现已拆分为 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#ImportError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImportError</span></code></a> （当 Django 无法找到设置模块时）和 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#RuntimeError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">RuntimeError</span></code></a> （当你尝试在已经使用过设置之后重新配置它们时）。</p>\n</section>\n<section id=\"login-url-has-moved\">\n<h4><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGIN_URL</span></code></a> 已移动<a class=\"heading-anchor\" href=\"#login-url-has-moved\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGIN_URL</span></code></a> 常量已从 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> 移动到 <code class=\"docutils literal notranslate\"><span class=\"pre\">settings</span></code> 模块。不再使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">django.contrib.auth</span> <span class=\"pre\">import</span> <span class=\"pre\">LOGIN_URL</span></code>，请改用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>。</p>\n</section>\n<section id=\"append-slash-behavior-has-been-updated\">\n<h4><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> 的行为已更新。<a class=\"heading-anchor\" href=\"#append-slash-behavior-has-been-updated\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>在 0.96 版本中，如果一个 URL 不以斜杠结尾，或者其路径的最后一个组件中没有句点，并且 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> 为 True，Django 会重定向到相同的 URL，但在末尾添加斜杠。现在，Django 会检查去掉尾部斜杠的模式是否与你的 URL 模式中的某些内容匹配。如果匹配成功，不会进行重定向，因为假定你是有意捕获该模式的。</p>\n<p>对大多数人来说，这不需要进行任何更改。然而，有些人的 URL 模式看起来像这样：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"sa\">r</span><span class=\"s2\">&quot;/some_prefix/(.*)$&quot;</span>\n</code></pre></div>\n<p>以前，这些模式会被重定向以添加尾部斜杠。如果你希望这些 URL 始终带有斜杠，请将模式改写为：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"sa\">r</span><span class=\"s2\">&quot;/some_prefix/(.*/)$&quot;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"smaller-model-changes\">\n<h3>较小的模型更改<a class=\"heading-anchor\" href=\"#smaller-model-changes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"different-exception-from-get\">\n<h4>与``get()``不同的异常<a class=\"heading-anchor\" href=\"#different-exception-from-get\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>现在，管理器返回 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/exceptions/#django.core.exceptions.MultipleObjectsReturned\" title=\"django.core.exceptions.MultipleObjectsReturned\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MultipleObjectsReturned</span></code></a> 异常，而不再返回 <a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#AssertionError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">AssertionError</span></code></a> 异常：</p>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"ne\">AssertionError</span><span class=\"p\">:</span>\n    <span class=\"n\">handle_the_error</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"k\">except</span> <span class=\"n\">Model</span><span class=\"o\">.</span><span class=\"n\">MultipleObjectsReturned</span><span class=\"p\">:</span>\n    <span class=\"n\">handle_the_error</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"lazydate-has-been-fired\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">LazyDate</span></code> 已删除。<a class=\"heading-anchor\" href=\"#lazydate-has-been-fired\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">LazyDate</span></code> 帮助类不再存在。</p>\n<p>默认字段值和查询参数都可以是可调用对象，因此可以将 <code class=\"docutils literal notranslate\"><span class=\"pre\">LazyDate</span></code> 的实例替换为对 <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime.datetime.now</span></code> 的引用：</p>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">maxlength</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">published</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">LazyDate</span><span class=\"p\">())</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Article</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">published</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"decimalfield-is-new-and-floatfield-is-now-a-proper-float\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code> 是新的，而 <code class=\"docutils literal notranslate\"><span class=\"pre\">FloatField</span></code> 现在是真正的浮点数字段。<a class=\"heading-anchor\" href=\"#decimalfield-is-new-and-floatfield-is-now-a-proper-float\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">field_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">(</span><span class=\"n\">max_digits</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"n\">decimal_places</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">field_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DecimalField</span><span class=\"p\">(</span><span class=\"n\">max_digits</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">,</span> <span class=\"n\">decimal_places</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>如果你忘记进行这个更改，你会看到关于 <code class=\"docutils literal notranslate\"><span class=\"pre\">FloatField</span></code> 在 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__</span></code> 中不接受 <code class=\"docutils literal notranslate\"><span class=\"pre\">max_digits</span></code> 属性的错误，因为新的 <code class=\"docutils literal notranslate\"><span class=\"pre\">FloatField</span></code> 不接受与精度相关的参数。</p>\n<p>如果你使用的是 MySQL 或 PostgreSQL，不需要进一步的更改。对于 <code class=\"docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code>，数据库列类型与旧的 <code class=\"docutils literal notranslate\"><span class=\"pre\">FloatField</span></code> 相同。</p>\n<p>如果你使用的是 SQLite，你需要强制数据库将相应的列视为十进制类型，而不是浮点数。要做到这一点，你需要在对代码进行更改并更新 Django 代码后重新加载数据。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p><strong>首先备份你的数据库!!!!</strong></p>\n<p>对于SQLite，这意味着要复制存储数据库的单个文件(该文件的名称是``settings.py``文件中的``DATABASE_NAME``)。</p>\n</aside>\n<p>要升级每个应用程序以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code>，你可以按照以下代码进行操作，将代码中的 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;app&gt;</span></code> 替换为每个应用程序的名称：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>./manage.py<span class=\"w\"> </span>dumpdata<span class=\"w\"> </span>--format<span class=\"o\">=</span>xml<span class=\"w\"> </span>&lt;app&gt;<span class=\"w\"> </span>&gt;<span class=\"w\"> </span>data-dump.xml\n<span class=\"gp\">$ </span>./manage.py<span class=\"w\"> </span>reset<span class=\"w\"> </span>&lt;app&gt;\n<span class=\"gp\">$ </span>./manage.py<span class=\"w\"> </span>loaddata<span class=\"w\"> </span>data-dump.xml\n</code></pre></div>\n<p>注意：</p>\n<ol class=\"arabic simple\">\n<li><p>在这个过程的第一步中，重要的是记住要使用 XML 格式。我们利用了 XML 数据转储的一个特性，使得将浮点数转换为 SQLite 中的十进制数成为可能。</p></li>\n<li><p>在第二步中，你将被要求确认你是否准备好丢失相关应用程序的数据。选择是；我们将在第三步中恢复这些数据。</p></li>\n<li><p>在这个更改之前，Django 附带的应用程序中没有使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">DecimalField</span></code>，所以你不需要担心为任何标准的 Django 模型执行此过程。</p></li>\n</ol>\n<p>如果上述过程出现问题，只需将备份的数据库文件复制到原始文件上，然后重新开始。</p>\n</section>\n</section>\n<section id=\"internationalization\">\n<h3>国际化<a class=\"heading-anchor\" href=\"#internationalization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"django-views-i18n-set-language-now-requires-a-post-request\">\n<h4><a class=\"reference internal\" href=\"/zh-hans/5.2/topics/i18n/translation/#django.views.i18n.set_language\" title=\"django.views.i18n.set_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.i18n.set_language()</span></code></a> 现在要求使用 POST 请求。<a class=\"heading-anchor\" href=\"#django-views-i18n-set-language-now-requires-a-post-request\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>以前使用的是 GET 请求。旧的行为意味着可以通过 GET 请求更改状态（用于显示站点的区域设置），这违反了 HTTP 规范的建议。调用此视图的代码必须确保现在进行的是 POST 请求，而不是 GET 请求。这意味着你不能再使用链接来访问视图，而是必须使用某种表单提交方式（例如按钮）。</p>\n</section>\n<section id=\"is-no-longer-in-builtins\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> 不再位于内置函数中<a class=\"heading-anchor\" href=\"#is-no-longer-in-builtins\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> （其名称为单个下划线的可调用对象）不再被自动添加到内置函数中，也就是说，它不再在每个模块中自动可用。</p>\n<p>如果你之前依赖于 <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> 总是存在，现在应该显式导入 <code class=\"docutils literal notranslate\"><span class=\"pre\">ugettext</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">ugettext_lazy</span></code> （如果适用），并自己将其别名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ugettext</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"http-request-response-objects\">\n<h3>HTTP 请求/响应对象<a class=\"heading-anchor\" href=\"#http-request-response-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"dictionary-access-to-httprequest\">\n<h4>对于 <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 的字典访问：<a class=\"heading-anchor\" href=\"#dictionary-access-to-httprequest\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 对象不再直接支持字典风格的访问；以前，<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> 数据都可以直接在 <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 对象上使用（例如，你可以通过 <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">'some_form_key'</span> <span class=\"pre\">in</span> <span class=\"pre\">request</span></code> 或读取 <code class=\"docutils literal notranslate\"><span class=\"pre\">request['some_form_key']</span></code> 来检查表单数据。不再支持这种方式；如果你需要访问组合的 <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> 数据，请使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.REQUEST</span></code>。</p>\n<p>然而，强烈建议你始终明确查找你期望接收的请求类型的字典（<code class=\"docutils literal notranslate\"><span class=\"pre\">request.GET</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code>）；依赖于组合的 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.REQUEST</span></code> 字典可能会掩盖传入数据的来源。</p>\n</section>\n<section id=\"accessing-httpresponse-headers\">\n<h4>访问``HTTPResponse`` headers<a class=\"heading-anchor\" href=\"#accessing-httpresponse-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.http.HttpResponse.headers</span></code> 已重命名为 <code class=\"docutils literal notranslate\"><span class=\"pre\">_headers</span></code>，并且 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> 现在直接支持包含检查。所以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">header</span> <span class=\"pre\">in</span> <span class=\"pre\">response:</span></code> 而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">header</span> <span class=\"pre\">in</span> <span class=\"pre\">response.headers:</span></code>。</p>\n</section>\n</section>\n<section id=\"generic-relations\">\n<h3>通用关系<a class=\"heading-anchor\" href=\"#generic-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"generic-relations-have-been-moved-out-of-core\">\n<h4>通用关系已从核心中移出。<a class=\"heading-anchor\" href=\"#generic-relations-have-been-moved-out-of-core\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>通用关联类 -- <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericForeignKey</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">GenericRelation</span></code> -- 已移动到 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/contenttypes/#module-django.contrib.contenttypes\" title=\"django.contrib.contenttypes: Provides generic interface to installed models.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes</span></code></a> 模块。</p>\n</section>\n</section>\n<section id=\"testing\">\n<h3>测试中<a class=\"heading-anchor\" href=\"#testing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"django-test-client-login-has-changed\">\n<h4><a class=\"reference internal\" href=\"/zh-hans/5.2/topics/testing/tools/#django.test.Client.login\" title=\"django.test.Client.login\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">django.test.Client.login()</span></code></a> 发生了变化<a class=\"heading-anchor\" href=\"#django-test-client-login-has-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>老版本 (0.96):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Client</span>\n\n<span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">Client</span><span class=\"p\">()</span>\n<span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">login</span><span class=\"p\">(</span><span class=\"s2\">&quot;/path/to/login&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;myuser&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mypassword&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>新版本 (1.0):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># ... same as above, but then:</span>\n<span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">login</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;myuser&quot;</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"s2\">&quot;mypassword&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"management-commands\">\n<h3>管理命令<a class=\"heading-anchor\" href=\"#management-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"running-management-commands-from-your-code\">\n<h4>从你的代码中运行管理命令<a class=\"heading-anchor\" href=\"#running-management-commands-from-your-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/zh-hans/5.2/howto/custom-management-commands/#module-django.core.management\" title=\"django.core.management\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.core.management</span></code></a> 已经进行了大规模的重构。</p>\n<p>你的代码中对管理服务的调用现在需要使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">call_command</span></code>。例如，如果你有一些调用 flush 和 load_data 的测试代码：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">management</span>\n\n<span class=\"n\">management</span><span class=\"o\">.</span><span class=\"n\">flush</span><span class=\"p\">(</span><span class=\"n\">verbosity</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">interactive</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"n\">management</span><span class=\"o\">.</span><span class=\"n\">load_data</span><span class=\"p\">([</span><span class=\"s2\">&quot;test_data&quot;</span><span class=\"p\">],</span> <span class=\"n\">verbosity</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...你需要更改这段代码为：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">management</span>\n\n<span class=\"n\">management</span><span class=\"o\">.</span><span class=\"n\">call_command</span><span class=\"p\">(</span><span class=\"s2\">&quot;flush&quot;</span><span class=\"p\">,</span> <span class=\"n\">verbosity</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">interactive</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"n\">management</span><span class=\"o\">.</span><span class=\"n\">call_command</span><span class=\"p\">(</span><span class=\"s2\">&quot;loaddata&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;test_data&quot;</span><span class=\"p\">,</span> <span class=\"n\">verbosity</span><span class=\"o\">=</span><span class=\"mi\">0</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"subcommands-must-now-precede-options\">\n<h4>现在子命令必须在选项之前。<a class=\"heading-anchor\" href=\"#subcommands-must-now-precede-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin.py</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> 现在要求子命令必须在选项之前。因此：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>django-admin.py<span class=\"w\"> </span>--settings<span class=\"o\">=</span>foo.bar<span class=\"w\"> </span>runserver\n</code></pre></div>\n<p>...不再起作用，应该改为：</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>django-admin.py<span class=\"w\"> </span>runserver<span class=\"w\"> </span>--settings<span class=\"o\">=</span>foo.bar\n</code></pre></div>\n</section>\n</section>\n<section id=\"syndication\">\n<h3>联合<a class=\"heading-anchor\" href=\"#syndication\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"feed-init-has-changed\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">Feed.__init__</span></code> 发生了变化<a class=\"heading-anchor\" href=\"#feed-init-has-changed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>syndication 框架的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> 类的 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 方法现在将 <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 对象作为其第二个参数，而不是 feed 的 URL。这允许 syndication 框架在不需要 sites 框架的情况下工作。这只影响到子类化 <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed</span></code> 并覆盖 <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> 方法的代码，以及直接调用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Feed.__init__()</span></code> 的代码。</p>\n</section>\n</section>\n<section id=\"data-structures\">\n<h3>数据结构<a class=\"heading-anchor\" href=\"#data-structures\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"sorteddictfromlist-is-gone\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">SortedDictFromList</span></code> 已被移除<a class=\"heading-anchor\" href=\"#sorteddictfromlist-is-gone\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.newforms.forms.SortedDictFromList</span></code> 已被移除。<code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.datastructures.SortedDict</span></code> 现在可以通过元组序列进行实例化。</p>\n<p>要更新你的代码：</p>\n<ol class=\"arabic simple\">\n<li><p>在原先使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.newforms.forms.SortedDictFromList</span></code> 的地方，现在应该使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.datastructures.SortedDict</span></code>。</p></li>\n<li><p>因为 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.datastructures.SortedDict.copy</span></code> 不像 <code class=\"docutils literal notranslate\"><span class=\"pre\">SortedDictFromList.copy()</span></code> 那样返回深拷贝，如果你依赖于深拷贝，你需要更新你的代码。通过直接使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">copy.deepcopy</span></code> 来实现这一点。</p></li>\n</ol>\n</section>\n</section>\n<section id=\"database-backend-functions\">\n<h3>数据库后端函数<a class=\"heading-anchor\" href=\"#database-backend-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"database-backend-functions-have-been-renamed\">\n<h4>数据库后端函数已经改名。<a class=\"heading-anchor\" href=\"#database-backend-functions-have-been-renamed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>几乎所有数据库后端级别的函数都已被重命名和/或移动。虽然这些函数没有被文档化，但如果你使用了其中的任何一个函数，你需要修改你的代码，所有这些函数都在 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/db/#module-django.db\" title=\"django.db\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db</span></code></a> 中：</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>老版本 (0.96)</p></th>\n<th class=\"head\"><p>新版本 (1.0)</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_autoinc_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.autoinc_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_date_extract_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.date_extract_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_date_trunc_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.date_trunc_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_datetime_cast_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.datetime_cast_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_deferrable_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.deferrable_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_drop_foreignkey_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.drop_foreignkey_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_fulltext_search_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.fulltext_search_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_last_insert_id</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.last_insert_id</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_limit_offset_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.limit_offset_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_max_name_length</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.max_name_length</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_pk_default_value</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.pk_default_value</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_random_function_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.random_function_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_sql_flush</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.sql_flush</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_sql_sequence_reset</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.sequence_reset_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_start_transaction_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.start_transaction_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_tablespace_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.tablespace_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.quote_name</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.quote_name</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_query_set_class</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.query_set_class</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_field_cast_sql</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.field_cast_sql</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.get_drop_sequence</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.ops.drop_sequence_sql</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.OPERATOR_MAPPING</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.operators</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.allows_group_by_ordinal</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.allows_group_by_ordinal</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.allows_unique_and_pk</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.allows_unique_and_pk</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.autoindexes_primary_keys</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.autoindexes_primary_keys</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.needs_datetime_string_cast</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.needs_datetime_string_cast</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.needs_upper_for_iops</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.needs_upper_for_iops</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.supports_constraints</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.supports_constraints</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.supports_tablespaces</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.supports_tablespaces</span></code></p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.uses_case_insensitive_names</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.uses_case_insensitive_names</span></code></p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">backend.uses_custom_queryset</span></code></p></td>\n<td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.features.uses_custom_queryset</span></code></p></td>\n</tr>\n</tbody>\n</table>\n</div>\n</section>\n</section>\n</section>","rootId":"porting-your-apps-from-django-0-96-to-1-0","toc":[{"title":"常见变更","anchor":"common-changes","children":[{"title":"使用 Unicode 字符集","anchor":"use-unicode","children":[]},{"title":"模型","anchor":"models","children":[{"title":"maxlength 重命名为 max_length","anchor":"rename-maxlength-to-max-length","children":[]},{"title":"用 __unicode__ 代替 __str__","anchor":"replace-str-with-unicode","children":[]},{"title":"移除 prepopulated_from","anchor":"remove-prepopulated-from","children":[]},{"title":"移除 core","anchor":"remove-core","children":[]},{"title":"用 admin.py 替换  class Admin:","anchor":"replace-class-admin-with-admin-py","children":[]},{"title":"例如","anchor":"example","children":[]}]},{"title":"管理员","anchor":"the-admin","children":[{"title":"使用新的行内句法","anchor":"use-new-inline-syntax","children":[]},{"title":"简化 fields，或使用 fieldsets","anchor":"simplify-fields-or-use-fieldsets","children":[]}]},{"title":"URLs","anchor":"urls","children":[{"title":"更新你的根路径 urls.py 模块","anchor":"update-your-root-urls-py","children":[]}]},{"title":"视图","anchor":"views","children":[{"title":"使用 django.forms 来代替 newforms 用法","anchor":"use-django-forms-instead-of-newforms","children":[]},{"title":"处理上传文件使用新的 API","anchor":"handle-uploaded-files-using-the-new-api","children":[]},{"title":"文件字段使用新API处理","anchor":"work-with-file-fields-using-the-new-api","children":[]},{"title":"使用 Paginator 而不是 ObjectPaginator","anchor":"use-paginator-instead-of-objectpaginator","children":[]}]},{"title":"模板","anchor":"templates","children":[{"title":"学会爱上自动转义","anchor":"learn-to-love-autoescaping","children":[]}]}]},{"title":"不常见的变化","anchor":"less-common-changes","children":[{"title":"信号","anchor":"signals","children":[]},{"title":"评论","anchor":"comments","children":[]},{"title":"模板标签","anchor":"template-tags","children":[{"title":"spaceless 标签","anchor":"spaceless-tag","children":[]}]},{"title":"本地风味","anchor":"local-flavors","children":[{"title":"美国本地风味","anchor":"u-s-local-flavor","children":[]}]},{"title":"会话","anchor":"sessions","children":[{"title":"获取新的会话密钥","anchor":"getting-a-new-session-key","children":[]}]},{"title":"辅助工具","anchor":"fixtures","children":[{"title":"加载一行不再调用\"save()\"","anchor":"loading-a-row-no-longer-calls-save","children":[]}]},{"title":"配置","anchor":"settings","children":[{"title":"更好的异常处理","anchor":"better-exceptions","children":[]},{"title":"LOGIN_URL 已移动","anchor":"login-url-has-moved","children":[]},{"title":"APPEND_SLASH 的行为已更新。","anchor":"append-slash-behavior-has-been-updated","children":[]}]},{"title":"较小的模型更改","anchor":"smaller-model-changes","children":[{"title":"与``get()``不同的异常","anchor":"different-exception-from-get","children":[]},{"title":"LazyDate 已删除。","anchor":"lazydate-has-been-fired","children":[]},{"title":"DecimalField 是新的，而 FloatField 现在是真正的浮点数字段。","anchor":"decimalfield-is-new-and-floatfield-is-now-a-proper-float","children":[]}]},{"title":"国际化","anchor":"internationalization","children":[{"title":"django.views.i18n.set_language() 现在要求使用 POST 请求。","anchor":"django-views-i18n-set-language-now-requires-a-post-request","children":[]},{"title":"_() 不再位于内置函数中","anchor":"is-no-longer-in-builtins","children":[]}]},{"title":"HTTP 请求/响应对象","anchor":"http-request-response-objects","children":[{"title":"对于 HttpRequest 的字典访问：","anchor":"dictionary-access-to-httprequest","children":[]},{"title":"访问``HTTPResponse`` headers","anchor":"accessing-httpresponse-headers","children":[]}]},{"title":"通用关系","anchor":"generic-relations","children":[{"title":"通用关系已从核心中移出。","anchor":"generic-relations-have-been-moved-out-of-core","children":[]}]},{"title":"测试中","anchor":"testing","children":[{"title":"django.test.Client.login() 发生了变化","anchor":"django-test-client-login-has-changed","children":[]}]},{"title":"管理命令","anchor":"management-commands","children":[{"title":"从你的代码中运行管理命令","anchor":"running-management-commands-from-your-code","children":[]},{"title":"现在子命令必须在选项之前。","anchor":"subcommands-must-now-precede-options","children":[]}]},{"title":"联合","anchor":"syndication","children":[{"title":"Feed.__init__ 发生了变化","anchor":"feed-init-has-changed","children":[]}]},{"title":"数据结构","anchor":"data-structures","children":[{"title":"SortedDictFromList 已被移除","anchor":"sorteddictfromlist-is-gone","children":[]}]},{"title":"数据库后端函数","anchor":"database-backend-functions","children":[{"title":"数据库后端函数已经改名。","anchor":"database-backend-functions-have-been-renamed","children":[]}]}]}],"breadcrumbs":[{"docname":"releases/index","title":"发行说明","url":"/zh-hans/5.2/releases/"},{"docname":"releases/1.0","title":"Django 1.0 版本发行说明","url":"/zh-hans/5.2/releases/1.0/"}],"prev":{"docname":"releases/1.0","title":"Django 1.0 版本发行说明","url":"/zh-hans/5.2/releases/1.0/"},"next":{"docname":"releases/0.96","title":"Django 0.96 版本发行说明","url":"/zh-hans/5.2/releases/0.96/"},"formats":{"html":"/zh-hans/5.2/releases/1.0-porting-guide/","markdown":"/zh-hans/5.2/releases/1.0-porting-guide.md","json":"/zh-hans/5.2/releases/1.0-porting-guide.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/releases/1.0-porting-guide.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/releases/1.0-porting-guide/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}