{"title":"The \"sites\" framework","version":"3.1","locale":"ja","docname":"ref/contrib/sites","url":"/ja/3.1/ref/contrib/sites/","canonical":"https://djangodocs.dev/ja/3.1/ref/contrib/sites/","summary":"Django comes with an optional \"sites\" framework. It's a hook for associating objects and functionality to particular websites, and it's a holding place for the…","html":"<span id=\"the-sites-framework\"></span><h1>The &quot;sites&quot; framework<a class=\"heading-anchor\" href=\"#module-django.contrib.sites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django comes with an optional &quot;sites&quot; framework. It's a hook for associating\nobjects and functionality to particular websites, and it's a holding place for\nthe domain names and &quot;verbose&quot; names of your Django-powered sites.</p>\n<p>Use it if your single Django installation powers more than one site and you\nneed to differentiate between those sites in some way.</p>\n<p>The sites framework is mainly based on this model:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Site</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A model for storing the <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> attributes of a website.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site.domain\">\n<span class=\"sig-name descname\"><span class=\"pre\">domain</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site.domain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The fully qualified domain name associated with the website.\nFor example, <code class=\"docutils literal notranslate\"><span class=\"pre\">www.example.com</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.models.Site.name\">\n<span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.models.Site.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A human-readable &quot;verbose&quot; name for the website.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>The <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting specifies the database ID of the\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> object associated with that\nparticular settings file. If the setting is omitted, the\n<a class=\"reference internal\" href=\"#django.contrib.sites.shortcuts.get_current_site\" title=\"django.contrib.sites.shortcuts.get_current_site\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">get_current_site()</span></code></a> function will\ntry to get the current site by comparing the\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.domain\" title=\"django.contrib.sites.models.Site.domain\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">domain</span></code></a> with the host name from\nthe <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a> method.</p>\n<p>How you use this is up to you, but Django uses it in a couple of ways\nautomatically via a couple of conventions.</p>\n<section id=\"example-usage\">\n<h2>Example usage<a class=\"heading-anchor\" href=\"#example-usage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Why would you use sites? It's best explained through examples.</p>\n<section id=\"associating-content-with-multiple-sites\">\n<h3>Associating content with multiple sites<a class=\"heading-anchor\" href=\"#associating-content-with-multiple-sites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <a class=\"reference external\" href=\"http://www.ljworld.com/\">LJWorld.com</a> and <a class=\"reference external\" href=\"http://www.lawrence.com/\">Lawrence.com</a> sites are operated by the same news\norganization -- the Lawrence Journal-World newspaper in Lawrence, Kansas.\nLJWorld.com focused on news, while Lawrence.com focused on local entertainment.\nBut sometimes editors wanted to publish an article on <em>both</em> sites.</p>\n<p>The naive way of solving the problem would be to require site producers to\npublish the same story twice: once for LJWorld.com and again for Lawrence.com.\nBut that's inefficient for site producers, and it's redundant to store\nmultiple copies of the same story in the database.</p>\n<p>A better solution removes the content duplication: Both sites use the same\narticle database, and an article is associated with one or more sites. In\nDjango model terminology, that's represented by a\n<a class=\"reference internal\" href=\"/ja/3.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> in the <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code> model:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\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\">headline</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\">200</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">sites</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ManyToManyField</span><span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This accomplishes several things quite nicely:</p>\n<ul>\n<li><p>It lets the site producers edit all content -- on both sites -- in a\nsingle interface (the Django admin).</p></li>\n<li><p>It means the same story doesn't have to be published twice in the\ndatabase; it only has a single record in the database.</p></li>\n<li><p>It lets the site developers use the same Django view code for both sites.\nThe view code that displays a given story checks to make sure the requested\nstory is on the current site. It looks something like this:</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">article_detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">article_id</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"n\">Article</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"n\">article_id</span><span class=\"p\">,</span> <span class=\"n\">sites__id</span><span class=\"o\">=</span><span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"n\">Article</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">Http404</span><span class=\"p\">(</span><span class=\"s2\">&quot;Article does not exist on this site&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</li>\n</ul>\n</section>\n<section id=\"associating-content-with-a-single-site\">\n<h3>Associating content with a single site<a class=\"heading-anchor\" href=\"#associating-content-with-a-single-site\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Similarly, you can associate a model to the\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>\nmodel in a many-to-one relationship, using\n<a class=\"reference internal\" href=\"/ja/3.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>.</p>\n<p>For example, if an article is only allowed on a single site, you'd use a model\nlike this:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\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\">headline</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\">200</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"n\">site</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\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This has the same benefits as described in the last section.</p>\n</section>\n<section id=\"hooking-into-the-current-site-from-views\">\n<span id=\"hooking-into-current-site-from-views\"></span><h3>Hooking into the current site from views<a class=\"heading-anchor\" href=\"#hooking-into-the-current-site-from-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can use the sites framework in your Django views to do\nparticular things based on the site in which the view is being called.\nFor example:</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</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n\n<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=\"k\">if</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SITE_ID</span> <span class=\"o\">==</span> <span class=\"mi\">3</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something.</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>It's fragile to hard-code the site IDs like that, in case they change. The\ncleaner way of accomplishing the same thing is to check the current site's\ndomain:</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n\n<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\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;foo.com&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>This has also the advantage of checking if the sites framework is installed,\nand return a <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a> instance if\nit is not.</p>\n<p>If you don't have access to the request object, you can use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_current()</span></code> method of the <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>\nmodel's manager. You should then ensure that your settings file does contain\nthe <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting. This example is equivalent to the previous one:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_function_without_request</span><span class=\"p\">():</span>\n    <span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n    <span class=\"k\">if</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;foo.com&#39;</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something</span>\n        <span class=\"k\">pass</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Do something else.</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n</section>\n<section id=\"getting-the-current-domain-for-display\">\n<h3>Getting the current domain for display<a class=\"heading-anchor\" href=\"#getting-the-current-domain-for-display\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>LJWorld.com and Lawrence.com both have email alert functionality, which lets\nreaders sign up to get notifications when news happens. It's pretty basic: A\nreader signs up on a Web form and immediately gets an email saying,\n&quot;Thanks for your subscription.&quot;</p>\n<p>It'd be inefficient and redundant to implement this sign up processing code\ntwice, so the sites use the same code behind the scenes. But the &quot;thank you for\nsigning up&quot; notice needs to be different for each site. By using\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>\nobjects, we can abstract the &quot;thank you&quot; notice to use the values of the\ncurrent site's <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.name\" title=\"django.contrib.sites.models.Site.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a> and\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site.domain\" title=\"django.contrib.sites.models.Site.domain\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">domain</span></code></a>.</p>\n<p>Here's an example of what the form-handling view looks like:</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.sites.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_current_site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">register_for_newsletter</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Check form values, etc., and subscribe the user.</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">get_current_site</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n    <span class=\"n\">send_mail</span><span class=\"p\">(</span>\n        <span class=\"s1\">&#39;Thanks for subscribing to </span><span class=\"si\">%s</span><span class=\"s1\"> alerts&#39;</span> <span class=\"o\">%</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Thanks for your subscription. We appreciate it.</span><span class=\"se\">\\n\\n</span><span class=\"s1\">-The </span><span class=\"si\">%s</span><span class=\"s1\"> team.&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>\n            <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,</span>\n        <span class=\"p\">),</span>\n        <span class=\"s1\">&#39;editor@</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">domain</span><span class=\"p\">,</span>\n        <span class=\"p\">[</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"p\">],</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>On Lawrence.com, this email has the subject line &quot;Thanks for subscribing to\nlawrence.com alerts.&quot; On LJWorld.com, the email has the subject &quot;Thanks for\nsubscribing to LJWorld.com alerts.&quot; Same goes for the email's message body.</p>\n<p>Note that an even more flexible (but more heavyweight) way of doing this would\nbe to use Django's template system. Assuming Lawrence.com and LJWorld.com have\ndifferent template directories (<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>), you could\nfarm out to the template system like so:</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.mail</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">send_mail</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.template</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">loader</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">register_for_newsletter</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Check form values, etc., and subscribe the user.</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"n\">subject</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;alerts/subject.txt&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">({})</span>\n    <span class=\"n\">message</span> <span class=\"o\">=</span> <span class=\"n\">loader</span><span class=\"o\">.</span><span class=\"n\">get_template</span><span class=\"p\">(</span><span class=\"s1\">&#39;alerts/message.txt&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">render</span><span class=\"p\">({})</span>\n    <span class=\"n\">send_mail</span><span class=\"p\">(</span><span class=\"n\">subject</span><span class=\"p\">,</span> <span class=\"n\">message</span><span class=\"p\">,</span> <span class=\"s1\">&#39;editor@ljworld.com&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"p\">])</span>\n\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>In this case, you'd have to create <code class=\"file docutils literal notranslate\"><span class=\"pre\">subject.txt</span></code> and <code class=\"file docutils literal notranslate\"><span class=\"pre\">message.txt</span></code>\ntemplate files for both the LJWorld.com and Lawrence.com template directories.\nThat gives you more flexibility, but it's also more complex.</p>\n<p>It's a good idea to exploit the <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>\nobjects as much as possible, to remove unneeded complexity and redundancy.</p>\n</section>\n<section id=\"getting-the-current-domain-for-full-urls\">\n<h3>Getting the current domain for full URLs<a class=\"heading-anchor\" href=\"#getting-the-current-domain-for-full-urls\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django's <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> convention is nice for getting your objects'\nURL without the domain name, but in some cases you might want to display the\nfull URL -- with <code class=\"docutils literal notranslate\"><span class=\"pre\">http://</span></code> and the domain and everything -- for an object.\nTo do this, you can use the sites framework. An example:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</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=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">()</span>\n<span class=\"go\">&#39;/mymodel/objects/3/&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">domain</span>\n<span class=\"go\">&#39;example.com&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"s1\">&#39;https://</span><span class=\"si\">%s%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">domain</span><span class=\"p\">,</span> <span class=\"n\">obj</span><span class=\"o\">.</span><span class=\"n\">get_absolute_url</span><span class=\"p\">())</span>\n<span class=\"go\">&#39;https://example.com/mymodel/objects/3/&#39;</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"enabling-the-sites-framework\">\n<span id=\"id1\"></span><h2>Enabling the sites framework<a class=\"heading-anchor\" href=\"#enabling-the-sites-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>To enable the sites framework, follow these steps:</p>\n<ol class=\"arabic\">\n<li><p>Add <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sites'</span></code> to your <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> setting.</p></li>\n<li><p>Define a <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting:</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=\"n\">SITE_ID</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n</code></pre></div>\n</li>\n<li><p>Run <a class=\"reference internal\" href=\"/ja/3.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>.</p></li>\n</ol>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> registers a\n<a class=\"reference internal\" href=\"/ja/3.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> signal handler which creates a\ndefault site named <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code> with the domain <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code>. This site\nwill also be created after Django creates the test database. To set the\ncorrect name and domain for your project, you can use a <a class=\"reference internal\" href=\"/ja/3.1/topics/migrations/#data-migrations\"><span class=\"std std-ref\">data migration</span></a>.</p>\n<p>In order to serve different sites in production, you'd create a separate\nsettings file with each <code class=\"docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code> (perhaps importing from a common settings\nfile to avoid duplicating shared settings) and then specify the appropriate\n<span class=\"target\" id=\"index-0\"></span><a class=\"reference internal\" href=\"/ja/3.1/topics/settings/#envvar-DJANGO_SETTINGS_MODULE\"><code class=\"xref std std-envvar docutils literal notranslate\"><span class=\"pre\">DJANGO_SETTINGS_MODULE</span></code></a> for each site.</p>\n</section>\n<section id=\"caching-the-current-site-object\">\n<h2>Caching the current <code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span></code> object<a class=\"heading-anchor\" href=\"#caching-the-current-site-object\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>As the current site is stored in the database, each call to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Site.objects.get_current()</span></code> could result in a database query. But Django is a\nlittle cleverer than that: on the first request, the current site is cached, and\nany subsequent call returns the cached data instead of hitting the database.</p>\n<p>If for any reason you want to force a database query, you can tell Django to\nclear the cache using <code class=\"docutils literal notranslate\"><span class=\"pre\">Site.objects.clear_cache()</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=\"c1\"># First call; current site fetched from database.</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\"># Second call; current site fetched from cache.</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\"># Force a database query for the third call.</span>\n<span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">clear_cache</span><span class=\"p\">()</span>\n<span class=\"n\">current_site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"the-currentsitemanager\">\n<h2>The <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code><a class=\"heading-anchor\" href=\"#the-currentsitemanager\"><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.contrib.sites.managers.CurrentSiteManager\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">managers.</span></span><span class=\"sig-name descname\"><span class=\"pre\">CurrentSiteManager</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.managers.CurrentSiteManager\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>If <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> plays a key role in your\napplication, consider using the helpful\n<a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> in your\nmodel(s). It's a model <a class=\"reference internal\" href=\"/ja/3.1/topics/db/managers/\"><span class=\"doc\">manager</span></a> that\nautomatically filters its queries to include only objects associated\nwith the current <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>.</p>\n<aside class=\"admonition-mandatory-setting-site-id admonition\">\n<p class=\"admonition-title\">Mandatory <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a></p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code> is only usable when the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>\nsetting is defined in your settings.</p>\n</aside>\n<p>Use <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> by adding it to\nyour model explicitly. For example:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.managers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CurrentSiteManager</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Photo</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\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s1\">&#39;photos&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">photographer_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\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">site</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\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">on_site</span> <span class=\"o\">=</span> <span class=\"n\">CurrentSiteManager</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>With this model, <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.objects.all()</span></code> will return all <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> objects in\nthe database, but <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.on_site.all()</span></code> will return only the <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> objects\nassociated with the current site, according to the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting.</p>\n<p>Put another way, these two statements are equivalent:</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=\"n\">Photo</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">site</span><span class=\"o\">=</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">SITE_ID</span><span class=\"p\">)</span>\n<span class=\"n\">Photo</span><span class=\"o\">.</span><span class=\"n\">on_site</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>How did <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>\nknow which field of <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code> was the\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>? By default,\n<a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> looks for a\neither a <a class=\"reference internal\" href=\"/ja/3.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a> called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> or a\n<a class=\"reference internal\" href=\"/ja/3.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code> to filter on. If you use a field named something other than\n<code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">sites</span></code> to identify which\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> objects your object is\nrelated to, then you need to explicitly pass the custom field name as\na parameter to\n<a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a> on your\nmodel. The following model, which has a field called <code class=\"docutils literal notranslate\"><span class=\"pre\">publish_on</span></code>,\ndemonstrates this:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.sites.managers</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CurrentSiteManager</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Photo</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\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s1\">&#39;photos&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">photographer_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\">100</span><span class=\"p\">)</span>\n    <span class=\"n\">pub_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">()</span>\n    <span class=\"n\">publish_on</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\">Site</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">objects</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Manager</span><span class=\"p\">()</span>\n    <span class=\"n\">on_site</span> <span class=\"o\">=</span> <span class=\"n\">CurrentSiteManager</span><span class=\"p\">(</span><span class=\"s1\">&#39;publish_on&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>If you attempt to use <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>\nand pass a field name that doesn't exist, Django will raise a <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code>.</p>\n<p>Finally, note that you'll probably want to keep a normal\n(non-site-specific) <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> on your model, even if you use\n<a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>. As\nexplained in the <a class=\"reference internal\" href=\"/ja/3.1/topics/db/managers/\"><span class=\"doc\">manager documentation</span></a>, if\nyou define a manager manually, then Django won't create the automatic\n<code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code> manager for you. Also note that certain\nparts of Django -- namely, the Django admin site and generic views --\nuse whichever manager is defined <em>first</em> in the model, so if you want\nyour admin site to have access to all objects (not just site-specific\nones), put <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code> in your model, before you\ndefine <a class=\"reference internal\" href=\"#django.contrib.sites.managers.CurrentSiteManager\" title=\"django.contrib.sites.managers.CurrentSiteManager\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code></a>.</p>\n</section>\n<section id=\"site-middleware\">\n<span id=\"id2\"></span><h2>Site middleware<a class=\"heading-anchor\" href=\"#site-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>If you often use this pattern:</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.sites.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Site</span>\n\n<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\">site</span> <span class=\"o\">=</span> <span class=\"n\">Site</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_current</span><span class=\"p\">()</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>To avoid repetitions, add\n<a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#django.contrib.sites.middleware.CurrentSiteMiddleware\" title=\"django.contrib.sites.middleware.CurrentSiteMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.middleware.CurrentSiteMiddleware</span></code></a> to\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>. The middleware sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> attribute on every\nrequest object, so you can use <code class=\"docutils literal notranslate\"><span class=\"pre\">request.site</span></code> to get the current site.</p>\n</section>\n<section id=\"how-django-uses-the-sites-framework\">\n<h2>How Django uses the sites framework<a class=\"heading-anchor\" href=\"#how-django-uses-the-sites-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Although it's not required that you use the sites framework, it's strongly\nencouraged, because Django takes advantage of it in a few places. Even if your\nDjango installation is powering only a single site, you should take the two\nseconds to create the site object with your <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, and point\nto its ID in your <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting.</p>\n<p>Here's how Django uses the sites framework:</p>\n<ul class=\"simple\">\n<li><p>In the <a class=\"reference internal\" href=\"/ja/3.1/ref/contrib/redirects/#module-django.contrib.redirects\" title=\"django.contrib.redirects: A framework for managing redirects.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">redirects</span> <span class=\"pre\">framework</span></code></a>, each\nredirect object is associated with a particular site. When Django searches\nfor a redirect, it takes into account the current site.</p></li>\n<li><p>In the <a class=\"reference internal\" href=\"/ja/3.1/ref/contrib/flatpages/#module-django.contrib.flatpages\" title=\"django.contrib.flatpages: A framework for managing simple ?flat? HTML content in a database.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">flatpages</span> <span class=\"pre\">framework</span></code></a>, each\nflatpage is associated with a particular site. When a flatpage is created,\nyou specify its <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>, and the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/contrib/flatpages/#django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\" title=\"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatpageFallbackMiddleware</span></code></a>\nchecks the current site in retrieving flatpages to display.</p></li>\n<li><p>In the <a class=\"reference internal\" href=\"/ja/3.1/ref/contrib/syndication/#module-django.contrib.syndication\" title=\"django.contrib.syndication: A framework for generating syndication feeds, in RSS and Atom, quite easily.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">syndication</span> <span class=\"pre\">framework</span></code></a>, the\ntemplates for <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> automatically have access to a\nvariable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site</span> <span class=\"pre\">}}</span></code>, which is the\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> object representing the current\nsite. Also, the hook for providing item URLs will use the <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> from\nthe current <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> object if you don't\nspecify a fully-qualified domain.</p></li>\n<li><p>In the <a class=\"reference internal\" href=\"/ja/3.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">authentication</span> <span class=\"pre\">framework</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/3.1/topics/auth/default/#django.contrib.auth.views.LoginView\" title=\"django.contrib.auth.views.LoginView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.views.LoginView</span></code></a> passes the current\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> name to the template as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site_name</span> <span class=\"pre\">}}</span></code>.</p></li>\n<li><p>The shortcut view (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.views.shortcut</span></code>)\nuses the domain of the current\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> object when calculating\nan object's URL.</p></li>\n<li><p>In the admin framework, the &quot;view on site&quot; link uses the current\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> to work out the domain for the\nsite that it will redirect to.</p></li>\n</ul>\n</section>\n<section id=\"requestsite-objects\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code> objects<a class=\"heading-anchor\" href=\"#requestsite-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p id=\"id3\">Some <a class=\"reference internal\" href=\"/ja/3.1/ref/contrib/\"><span class=\"doc\">django.contrib</span></a> applications take advantage of\nthe sites framework but are architected in a way that doesn't <em>require</em> the\nsites framework to be installed in your database. (Some people don't want to,\nor just aren't <em>able</em> to install the extra database table that the sites\nframework requires.) For those cases, the framework provides a\n<a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.requests.RequestSite</span></code></a> class, which can be used as\na fallback when the database-backed sites framework is not available.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.requests.RequestSite\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">requests.</span></span><span class=\"sig-name descname\"><span class=\"pre\">RequestSite</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.requests.RequestSite\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A class that shares the primary interface of\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> (i.e., it has\n<code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> attributes) but gets its data from a Django\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> object rather than from a database.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.requests.RequestSite.__init__\">\n<span class=\"sig-name descname\"><span class=\"pre\">__init__</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sites.requests.RequestSite.__init__\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> attributes to the value of\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_host()</span></code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>A <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a> object has a similar\ninterface to a normal <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a> object,\nexcept its <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite.__init__\" title=\"django.contrib.sites.requests.RequestSite.__init__\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">__init__()</span></code></a>\nmethod takes an <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> object. It's able to deduce\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> by looking at the request's domain. It has\n<code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> methods to match the interface of\n<a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>, but the methods raise\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/exceptions.html#NotImplementedError\" title=\"(in Python v3.14)\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotImplementedError</span></code></a>.</p>\n</section>\n<section id=\"get-current-site-shortcut\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_site</span></code> shortcut<a class=\"heading-anchor\" href=\"#get-current-site-shortcut\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Finally, to avoid repetitive fallback code, the framework provides a\n<a class=\"reference internal\" href=\"#django.contrib.sites.shortcuts.get_current_site\" title=\"django.contrib.sites.shortcuts.get_current_site\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.sites.shortcuts.get_current_site()</span></code></a> function.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.shortcuts.get_current_site\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">shortcuts.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_current_site</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.sites.shortcuts.get_current_site\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A function that checks if <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> is installed and\nreturns either the current <a class=\"reference internal\" href=\"#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>\nobject or a <a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a> object\nbased on the request. It looks up the current site based on\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a> if the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting is not defined.</p>\n<p>Both a domain and a port may be returned by <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a> when the Host header has a port\nexplicitly specified, e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com:80</span></code>. In such cases, if the\nlookup fails because the host does not match a record in the database,\nthe port is stripped and the lookup is retried with the domain part\nonly. This does not apply to\n<a class=\"reference internal\" href=\"#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a> which will always\nuse the unmodified host.</p>\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.sites","toc":[{"title":"Example usage","anchor":"example-usage","children":[{"title":"Associating content with multiple sites","anchor":"associating-content-with-multiple-sites","children":[]},{"title":"Associating content with a single site","anchor":"associating-content-with-a-single-site","children":[]},{"title":"Hooking into the current site from views","anchor":"hooking-into-the-current-site-from-views","children":[]},{"title":"Getting the current domain for display","anchor":"getting-the-current-domain-for-display","children":[]},{"title":"Getting the current domain for full URLs","anchor":"getting-the-current-domain-for-full-urls","children":[]}]},{"title":"Enabling the sites framework","anchor":"enabling-the-sites-framework","children":[]},{"title":"Caching the current Site object","anchor":"caching-the-current-site-object","children":[]},{"title":"The CurrentSiteManager","anchor":"the-currentsitemanager","children":[]},{"title":"Site middleware","anchor":"site-middleware","children":[]},{"title":"How Django uses the sites framework","anchor":"how-django-uses-the-sites-framework","children":[]},{"title":"RequestSite objects","anchor":"requestsite-objects","children":[]},{"title":"get_current_site shortcut","anchor":"get-current-site-shortcut","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/ja/3.1/ref/"},{"docname":"ref/contrib/index","title":"contrib packages","url":"/ja/3.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/sitemaps","title":"The sitemap framework","url":"/ja/3.1/ref/contrib/sitemaps/"},"next":{"docname":"ref/contrib/staticfiles","title":"The staticfiles app","url":"/ja/3.1/ref/contrib/staticfiles/"},"formats":{"html":"/ja/3.1/ref/contrib/sites/","markdown":"/ja/3.1/ref/contrib/sites.md","json":"/ja/3.1/ref/contrib/sites.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/ref/contrib/sites.txt","official":"https://docs.djangoproject.com/ja/3.1/ref/contrib/sites/","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","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}