{"title":"基础视图","version":"5.0","locale":"zh-hans","docname":"ref/class-based-views/base","url":"/zh-hans/5.0/ref/class-based-views/base/","canonical":"https://djangodocs.dev/zh-hans/5.0/ref/class-based-views/base/","summary":"以下三个类提供了创建 Django 视图所需的大部分功能。你可以把它们看作是父类的视图，它们可以自己使用，也可以从父类继承。","html":"<h1>基础视图<a class=\"heading-anchor\" href=\"#base-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>以下三个类提供了创建 Django 视图所需的大部分功能。你可以把它们看作是 <em>父</em> 类的视图，它们可以自己使用，也可以从父类继承。它们可能无法提供项目所需的所有功能，在这种情况下，有基于类的混入和通用视图。</p>\n<p>Django 内置的许多基于类的视图都是从其他基于类的视图或各种混入中继承过来的。因为这个继承链非常重要，所以祖先类被记录在 <strong>祖先（MRO）</strong> 节标题下。MRO 是方法解析顺序的缩写。</p>\n<section id=\"view\">\n<h2><code class=\"docutils literal notranslate\">View</code><a class=\"heading-anchor\" href=\"#view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">django.views.generic.base.</span><span class=\"sig-name descname\">View</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对于基本视图类，所有的基于类的视图都要继承这个基类。它并不是严格意义上的通用视图，因此也可以从``django.views``导入。</p>\n<p><strong>方法流程图</strong></p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\">setup()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.http_method_not_allowed\" title=\"django.views.generic.base.View.http_method_not_allowed\"><code class=\"xref py py-meth docutils literal notranslate\">http_method_not_allowed()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.options\" title=\"django.views.generic.base.View.options\"><code class=\"xref py py-meth docutils literal notranslate\">options()</code></a></p></li>\n</ol>\n<p><strong>示例 views.py</strong>：</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.views</span> <span class=\"kn\">import</span> View\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyView</span><span class=\"p\">(</span>View<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;Hello, World!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><strong>示例 urls.py</strong>：</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.views</span> <span class=\"kn\">import</span> MyView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;mine/&quot;</span><span class=\"p\">,</span> MyView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;my-view&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>属性</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.http_method_names\">\n<span class=\"sig-name descname\">http_method_names</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.http_method_names\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>此视图将接受的 HTT P方法名称列表。</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=\"p\">[</span><span class=\"s2\">&quot;get&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;post&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;put&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;patch&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;delete&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;head&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;options&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;trace&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n</dd></dl>\n\n<p><strong>方法</strong></p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.as_view\">\n<em class=\"property\"><span class=\"k\">classmethod</span> </em><span class=\"sig-name descname\">as_view</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">**</span>initkwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.as_view\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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>response <span class=\"o\">=</span> MyView<span class=\"o\">.</span>as_view<span class=\"p\">()(</span>request<span class=\"p\">)</span>\n</code></pre></div>\n<p>返回的视图有 <code class=\"docutils literal notranslate\">view_class</code> 和 <code class=\"docutils literal notranslate\">view_initkwargs</code> 属性。</p>\n<p>当视图在请求／响应周期中被调用时， <a class=\"reference internal\" href=\"#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\">setup()</code></a> 方法将 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a> 分配给视图的 <code class=\"docutils literal notranslate\">request</code> 属性，将任何位置和／或关键字参数 <a class=\"reference internal\" href=\"/zh-hans/5.0/topics/http/urls/#how-django-processes-a-request\"><span class=\"std std-ref\">从 URL 模式</span></a> 中捕获的参数分别分配给 <code class=\"docutils literal notranslate\">args</code> 和 <code class=\"docutils literal notranslate\">kwargs</code> 属性。然后调用 <a class=\"reference internal\" href=\"#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a>。</p>\n<p>如果一个 <code class=\"docutils literal notranslate\">View</code> 子类定义了异步（<code class=\"docutils literal notranslate\">async def</code>）方法处理程序，<code class=\"docutils literal notranslate\">as_view()</code> 将把返回的可调用对象标记为协程函数。如果在单个视图类上同时定义了异步（<code class=\"docutils literal notranslate\">async def</code>）和同步（<code class=\"docutils literal notranslate\">def</code>）处理程序，将会引发 <code class=\"docutils literal notranslate\">ImproperlyConfigured</code> 异常。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.setup\">\n<span class=\"sig-name descname\">setup</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.setup\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>在 <a class=\"reference internal\" href=\"#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a> 之前执行关键视图初始化。</p>\n<p>如果覆盖这个方法，必须调用 <code class=\"docutils literal notranslate\">super()</code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.dispatch\">\n<span class=\"sig-name descname\">dispatch</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.dispatch\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>视图的 <code class=\"docutils literal notranslate\">view</code> 部分 -- 接受 <code class=\"docutils literal notranslate\">request</code> 参数加参数的方法，并返回 HTTP 响应。</p>\n<p>默认的实现将检查 HTTP 方法，并尝试委托给与 HTTP 方法相匹配的方法；<code class=\"docutils literal notranslate\">GET</code> 将委托给 <code class=\"docutils literal notranslate\">get()</code>，<code class=\"docutils literal notranslate\">POST</code> 将委托给 <code class=\"docutils literal notranslate\">post()</code>，以此类推。</p>\n<p>默认情况下，<code class=\"docutils literal notranslate\">HEAD</code> 请求将被委托给 <code class=\"docutils literal notranslate\">get()</code>。如果你需要以不同于 <code class=\"docutils literal notranslate\">GET</code> 的方式处理 <code class=\"docutils literal notranslate\">HEAD</code> 请求，你可以覆盖 <code class=\"docutils literal notranslate\">head()</code> 方法。参见 <a class=\"reference internal\" href=\"/zh-hans/5.0/topics/class-based-views/#supporting-other-http-methods\"><span class=\"std std-ref\">支持其他 HTTP 方法</span></a> 的例子。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.http_method_not_allowed\">\n<span class=\"sig-name descname\">http_method_not_allowed</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.http_method_not_allowed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果视图被调用的 HTTP 方法不支持，就会调用这个方法代替。</p>\n<p>默认的实现返回 <code class=\"docutils literal notranslate\">HttpResponseNotAllowed</code>，其中包含一个纯文本的允许方法列表。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.View.options\">\n<span class=\"sig-name descname\">options</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em>, <em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.View.options\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>处理响应 OPTIONS HTTP 动词的请求。返回一个包含 <code class=\"docutils literal notranslate\">Allow</code> 头的响应，该头包含一个视图允许的 HTTP 方法名称列表。</p>\n<p>如果类上的其他 HTTP 方法处理程序是异步的（<code class=\"docutils literal notranslate\">async def</code>），那么响应将被包装在一个协程函数中，以便与 <code class=\"docutils literal notranslate\">await</code> 一起使用。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n<section id=\"templateview\">\n<h2><code class=\"docutils literal notranslate\">TemplateView</code><a class=\"heading-anchor\" href=\"#templateview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.TemplateView\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">django.views.generic.base.</span><span class=\"sig-name descname\">TemplateView</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.TemplateView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>渲染一个给定的模板，其上下文包含 URL 中捕获的参数。</p>\n<p><strong>祖先（MRO）</strong></p>\n<p>该视图从以下视图继承方法和属性。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.0/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin\" title=\"django.views.generic.base.TemplateResponseMixin\"><code class=\"xref py py-class docutils literal notranslate\">django.views.generic.base.TemplateResponseMixin</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.0/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin\" title=\"django.views.generic.base.ContextMixin\"><code class=\"xref py py-class docutils literal notranslate\">django.views.generic.base.ContextMixin</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\">django.views.generic.base.View</code></a></p></li>\n</ul>\n<p><strong>方法流程图</strong></p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\">setup()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.http_method_not_allowed\" title=\"django.views.generic.base.View.http_method_not_allowed\"><code class=\"xref py py-meth docutils literal notranslate\">http_method_not_allowed()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.0/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.get_context_data\" title=\"django.views.generic.base.ContextMixin.get_context_data\"><code class=\"xref py py-meth docutils literal notranslate\">get_context_data()</code></a></p></li>\n</ol>\n<p><strong>示例 views.py</strong>：</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=\"nn\">django.views.generic.base</span> <span class=\"kn\">import</span> TemplateView\n\n<span class=\"kn\">from</span> <span class=\"nn\">articles.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"k\">class</span> <span class=\"nc\">HomePageView</span><span class=\"p\">(</span>TemplateView<span class=\"p\">):</span>\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;home.html&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        context <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_context_data<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        context<span class=\"p\">[</span><span class=\"s2\">&quot;latest_articles&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> Article<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()[:</span><span class=\"mi\">5</span><span class=\"p\">]</span>\n        <span class=\"k\">return</span> context\n</code></pre></div>\n<p><strong>示例 urls.py</strong>：</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.views</span> <span class=\"kn\">import</span> HomePageView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> HomePageView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;home&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>上下文</strong></p>\n<ul class=\"simple\">\n<li><p>填充（通过 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin\" title=\"django.views.generic.base.ContextMixin\"><code class=\"xref py py-class docutils literal notranslate\">ContextMixin</code></a>）从服务于视图的 URL 模式中捕获的关键字参数。</p></li>\n<li><p>你也可以使用 <a class=\"reference internal\" href=\"/zh-hans/5.0/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.extra_context\" title=\"django.views.generic.base.ContextMixin.extra_context\"><code class=\"xref py py-attr docutils literal notranslate\">extra_context</code></a> 关键字参数为 <a class=\"reference internal\" href=\"#django.views.generic.base.View.as_view\" title=\"django.views.generic.base.View.as_view\"><code class=\"xref py py-meth docutils literal notranslate\">as_view()</code></a> 添加上下文。</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"redirectview\">\n<h2><code class=\"docutils literal notranslate\">RedirectView</code><a class=\"heading-anchor\" href=\"#redirectview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-prename descclassname\">django.views.generic.base.</span><span class=\"sig-name descname\">RedirectView</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>重定向到给定的 URL。</p>\n<p>给定的 URL 可能包含字典式的字符串格式，将对 URL 中捕获的参数进行插值。因为关键字插值 <em>总是</em> 进行的（即使没有参数传递进来），URL 中的任何 <code class=\"docutils literal notranslate\">&quot;%&quot;</code> 字符必须写成 <code class=\"docutils literal notranslate\">&quot;%%&quot;</code>，这样 Python 就会在输出中把它们转换为一个百分号。</p>\n<p>如果给定的 UR L是 <code class=\"docutils literal notranslate\">None</code>，Django 将返回一个 <code class=\"docutils literal notranslate\">HttpResponseGone</code> （410）。</p>\n<p><strong>祖先（MRO）</strong></p>\n<p>这个视图从以下的视图中继承了方法和属性：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View\" title=\"django.views.generic.base.View\"><code class=\"xref py py-class docutils literal notranslate\">django.views.generic.base.View</code></a></p></li>\n</ul>\n<p><strong>方法流程图</strong></p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\">setup()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.View.http_method_not_allowed\" title=\"django.views.generic.base.View.http_method_not_allowed\"><code class=\"xref py py-meth docutils literal notranslate\">http_method_not_allowed()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#django.views.generic.base.RedirectView.get_redirect_url\" title=\"django.views.generic.base.RedirectView.get_redirect_url\"><code class=\"xref py py-meth docutils literal notranslate\">get_redirect_url()</code></a></p></li>\n</ol>\n<p><strong>示例 views.py</strong>：</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=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> get_object_or_404\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.base</span> <span class=\"kn\">import</span> RedirectView\n\n<span class=\"kn\">from</span> <span class=\"nn\">articles.models</span> <span class=\"kn\">import</span> Article\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ArticleCounterRedirectView</span><span class=\"p\">(</span>RedirectView<span class=\"p\">):</span>\n    permanent <span class=\"o\">=</span> <span class=\"kc\">False</span>\n    query_string <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    pattern_name <span class=\"o\">=</span> <span class=\"s2\">&quot;article-detail&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_redirect_url</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        article <span class=\"o\">=</span> get_object_or_404<span class=\"p\">(</span>Article<span class=\"p\">,</span> pk<span class=\"o\">=</span>kwargs<span class=\"p\">[</span><span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">])</span>\n        article<span class=\"o\">.</span>update_counter<span class=\"p\">()</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_redirect_url<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n</code></pre></div>\n<p><strong>示例 urls.py</strong>：</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.base</span> <span class=\"kn\">import</span> RedirectView\n\n<span class=\"kn\">from</span> <span class=\"nn\">article.views</span> <span class=\"kn\">import</span> ArticleCounterRedirectView<span class=\"p\">,</span> ArticleDetailView\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;counter/&lt;int:pk&gt;/&quot;</span><span class=\"p\">,</span>\n        ArticleCounterRedirectView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;article-counter&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;details/&lt;int:pk&gt;/&quot;</span><span class=\"p\">,</span> ArticleDetailView<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;article-detail&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;go-to-django/&quot;</span><span class=\"p\">,</span>\n        RedirectView<span class=\"o\">.</span>as_view<span class=\"p\">(</span>url<span class=\"o\">=</span><span class=\"s2\">&quot;https://www.djangoproject.com/&quot;</span><span class=\"p\">),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;go-to-django&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>属性</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView.url\">\n<span class=\"sig-name descname\">url</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView.url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>要重定向到的 URL，作为一个字符串。或者 <code class=\"docutils literal notranslate\">None</code> 引发 410（Gone）HTTP 错误。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView.pattern_name\">\n<span class=\"sig-name descname\">pattern_name</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView.pattern_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>要重定向到的 URL 模式的名称。重定向将使用与此视图传递的相同的 args 和 kwargs 来完成。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView.permanent\">\n<span class=\"sig-name descname\">permanent</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView.permanent\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>重定向是否应该是永久的。这里唯一的区别是返回的 HTTP 状态码。如果 <code class=\"docutils literal notranslate\">True</code>，那么重定向将使用状态码 301。如果 <code class=\"docutils literal notranslate\">False</code>，那么重定向将使用状态码 302。默认情况下，<code class=\"docutils literal notranslate\">permanent</code> 是 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView.query_string\">\n<span class=\"sig-name descname\">query_string</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView.query_string\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>是否将 GET 查询字符串传递到新位置。如果 <code class=\"docutils literal notranslate\">True</code>，那么查询字符串将被附加到 URL 中。如果 <code class=\"docutils literal notranslate\">False</code>，那么查询字符串将被丢弃。默认情况下，<code class=\"docutils literal notranslate\">query_string</code> 是 <code class=\"docutils literal notranslate\">False</code>。</p>\n</dd></dl>\n\n<p><strong>方法</strong></p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.views.generic.base.RedirectView.get_redirect_url\">\n<span class=\"sig-name descname\">get_redirect_url</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>args</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.generic.base.RedirectView.get_redirect_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>构建用于重定向的目标 URL。</p>\n<p><code class=\"docutils literal notranslate\">args</code> 和 <code class=\"docutils literal notranslate\">kwargs</code> 参数分别是位置参数和／或关键字参数 <a class=\"reference internal\" href=\"/zh-hans/5.0/topics/http/urls/#how-django-processes-a-request\"><span class=\"std std-ref\">从 URL 模式</span></a> 中获取。</p>\n<p>默认实现使用 <a class=\"reference internal\" href=\"#django.views.generic.base.RedirectView.url\" title=\"django.views.generic.base.RedirectView.url\"><code class=\"xref py py-attr docutils literal notranslate\">url</code></a> 作为起始字符串，并使用 URL 中捕获的命名组对该字符串中的 <code class=\"docutils literal notranslate\">%</code> 命名参数进行扩展。</p>\n<p>如果没有设置 <a class=\"reference internal\" href=\"#django.views.generic.base.RedirectView.url\" title=\"django.views.generic.base.RedirectView.url\"><code class=\"xref py py-attr docutils literal notranslate\">url</code></a>，<code class=\"docutils literal notranslate\">get_redirect_url()</code> 尝试使用 URL 中捕获的内容来反推 <a class=\"reference internal\" href=\"#django.views.generic.base.RedirectView.pattern_name\" title=\"django.views.generic.base.RedirectView.pattern_name\"><code class=\"xref py py-attr docutils literal notranslate\">pattern_name</code></a> （命名组和未命名组都会使用）。</p>\n<p>如果被 <a class=\"reference internal\" href=\"#django.views.generic.base.RedirectView.query_string\" title=\"django.views.generic.base.RedirectView.query_string\"><code class=\"xref py py-attr docutils literal notranslate\">query_string</code></a> 请求，它也会将查询字符串附加到生成的 URL 中。子类可以实现任何他们想要的行为，只要该方法返回一个重定向就绪的 URL 字符串。</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>","rootId":"base-views","toc":[{"title":"View","anchor":"view","children":[]},{"title":"TemplateView","anchor":"templateview","children":[]},{"title":"RedirectView","anchor":"redirectview","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/5.0/ref/"},{"docname":"ref/class-based-views/index","title":"内置基于类的视图 API","url":"/zh-hans/5.0/ref/class-based-views/"}],"prev":{"docname":"ref/class-based-views/index","title":"内置基于类的视图 API","url":"/zh-hans/5.0/ref/class-based-views/"},"next":{"docname":"ref/class-based-views/generic-display","title":"通用显示视图","url":"/zh-hans/5.0/ref/class-based-views/generic-display/"},"formats":{"html":"/zh-hans/5.0/ref/class-based-views/base/","markdown":"/zh-hans/5.0/ref/class-based-views/base.md","json":"/zh-hans/5.0/ref/class-based-views/base.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/class-based-views/base.txt","official":"https://docs.djangoproject.com/zh-hans/5.0/ref/class-based-views/base/","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","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}