{"title":"Ramverket för ”webbplatser”","version":"6.1","locale":"sv","docname":"ref/contrib/sites","url":"/sv/6.1/ref/contrib/sites/","canonical":"https://djangodocs.dev/sv/6.1/ref/contrib/sites/","summary":"Django levereras med ett valfritt ”sites”-ramverk. Det är en hook för att associera objekt och funktionalitet till specifika webbplatser, och det är en plats för…","html":"<span id=\"the-sites-framework\"></span><h1>Ramverket för ”webbplatser”<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 levereras med ett valfritt ”sites”-ramverk. Det är en hook för att associera objekt och funktionalitet till specifika webbplatser, och det är en plats för domännamnen och ”verbose”-namnen på dina Django-drivna webbplatser.</p>\n<p>Använd den om din enda Django-installation driver mer än en webbplats och du behöver skilja mellan dessa webbplatser på något sätt.</p>\n<p>Webbplatsernas ramverk bygger huvudsakligen på denna modell:</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>En modell för att lagra attributen <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> för en webbplats.</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>Det fullständigt kvalificerade domännamnet som är kopplat till webbplatsen. Till exempel: <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>Ett mänskligt läsbart, ”mångordigt” namn för webbplatsen.</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>Inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> anger databas-ID för objektet <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> som är associerat med just den inställningsfilen. Om inställningen utelämnas kommer funktionen <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> att försöka hämta den aktuella webbplatsen genom att jämföra <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> med värdnamnet från metoden <a class=\"reference internal\" href=\"/sv/6.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>.</p>\n<p>Hur du använder detta är upp till dig, men Django använder det på ett par sätt automatiskt via ett par konventioner.</p>\n<section id=\"example-usage\">\n<h2>Exempel på användning<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>Varför skulle du använda webbplatser? Det förklaras bäst med hjälp av exempel.</p>\n<section id=\"associating-content-with-multiple-sites\">\n<h3>Koppla innehåll till flera webbplatser<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>Webbplatserna <a class=\"reference external\" href=\"https://www2.ljworld.com/\">LJWorld.com</a> och Lawrence.com drevs av samma nyhetsorganisation - tidningen Lawrence Journal-World i Lawrence, Kansas. LJWorld.com fokuserade på nyheter, medan Lawrence.com fokuserade på lokal underhållning. Men ibland ville redaktörerna publicera en artikel på <em>båda</em> webbplatserna.</p>\n<p>Det naiva sättet att lösa problemet skulle vara att kräva att sajtproducenterna publicerar samma artikel två gånger: en gång för LJWorld.com och en gång för Lawrence.com. Men det är ineffektivt för sajtproducenterna, och det är överflödigt att lagra flera kopior av samma artikel i databasen.</p>\n<p>En bättre lösning tar bort dupliceringen av innehållet: Båda webbplatserna använder samma artikeldatabas, och en artikel är associerad med en eller flera webbplatser. I Djangos modellterminologi representeras detta av en <a class=\"reference internal\" href=\"/sv/6.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> i modellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Article</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.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\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>Detta åstadkommer flera saker på ett bra sätt:</p>\n<ul>\n<li><p>Det låter webbplatsens producenter redigera allt innehåll - på båda webbplatserna - i ett enda gränssnitt (Django-admin).</p></li>\n<li><p>Det innebär att samma berättelse inte behöver publiceras två gånger i databasen, utan att den bara har en enda post i databasen.</p></li>\n<li><p>Det gör att webbplatsutvecklarna kan använda samma Django-visningskod för båda webbplatserna. Vykoden som visar en viss berättelse kontrollerar att den begärda berättelsen finns på den aktuella webbplatsen. Det ser ut ungefär så här:</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\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>Koppla innehåll till en enskild webbplats<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>På samma sätt kan du associera en modell till modellen <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 en många-till-en-relation med hjälp av <a class=\"reference internal\" href=\"/sv/6.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>Om en artikel till exempel bara är tillåten på en enda webbplats använder du en modell som denna:</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\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>Detta har samma fördelar som beskrivs i det sista avsnittet.</p>\n</section>\n<section id=\"hooking-into-the-current-site-from-views\">\n<span id=\"hooking-into-current-site-from-views\"></span><h3>Ansluta till den aktuella webbplatsen från vyer<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>Du kan använda sites-ramverket i dina Django-vyer för att göra särskilda saker baserat på den webbplats där vyn anropas. Till exempel:</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\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 hardcode 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\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=\"s2\">&quot;foo.com&quot;</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>Detta har också fördelen att kontrollera om webbplatsramverket är installerat och returnera en <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>-instans om det inte är det.</p>\n<p>Om du inte har tillgång till request-objektet kan du använda metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">get_current()</span></code> i <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>-modellens manager. Du bör då se till att din inställningsfil innehåller inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>. Detta exempel är likvärdigt med det föregående:</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\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=\"s2\">&quot;foo.com&quot;</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>Hämta den aktuella domänen för visning<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 och Lawrence.com har båda en funktion för e-postaviseringar, som gör det möjligt för läsare att registrera sig för att få meddelanden när nyheter inträffar. Det är ganska enkelt: En läsare registrerar sig via ett webbformulär och får omedelbart ett e-postmeddelande med texten ”Tack för din prenumeration”</p>\n<p>Det skulle vara ineffektivt och överflödigt att implementera den här koden för registrering två gånger, så webbplatserna använder samma kod bakom kulisserna. Men meddelandet ”tack för att du registrerade dig” måste vara olika för varje webbplats. Genom att använda <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>-objekt kan vi abstrahera ”tack”-meddelandet för att använda värdena för den aktuella webbplatsens <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> och <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>Här är ett exempel på hur formulärhanteringsvyn ser ut:</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\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=\"s2\">&quot;Thanks for subscribing to </span><span class=\"si\">%s</span><span class=\"s2\"> alerts&quot;</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=\"s2\">&quot;Thanks for your subscription. We appreciate it.</span><span class=\"se\">\\n\\n</span><span class=\"s2\">-The </span><span class=\"si\">%s</span><span class=\"s2\"> team.&quot;</span>\n        <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">current_site</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">,),</span>\n        <span class=\"s2\">&quot;editor@</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</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>På Lawrence.com har det här e-postmeddelandet ämnesraden ”Tack för att du prenumererar på lawrence.com-varningar.” På LJWorld.com har e-postmeddelandet ämnet ”Tack för att du prenumererar på LJWorld.com-varningar.” Samma sak gäller för e-postmeddelandets brödtext.</p>\n<p>Observera att ett ännu mer flexibelt (men mer tungrott) sätt att göra detta skulle vara att använda Djangos mallsystem. Om vi antar att Lawrence.com och LJWorld.com har olika mallkataloger (<a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEMPLATES-DIRS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DIRS</span></code></a>), kan du använda mallsystemet så här:</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\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=\"s2\">&quot;alerts/subject.txt&quot;</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=\"s2\">&quot;alerts/message.txt&quot;</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=\"s2\">&quot;editor@ljworld.com&quot;</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>I det här fallet skulle du behöva skapa <code class=\"file docutils literal notranslate\"><span class=\"pre\">subject.txt</span></code> och <code class=\"file docutils literal notranslate\"><span class=\"pre\">message.txt</span></code> mallfiler för både LJWorld.com och Lawrence.com mallkataloger. Det ger dig mer flexibilitet, men det är också mer komplext.</p>\n<p>Det är en bra idé att utnyttja <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>-objekten så mycket som möjligt för att ta bort onödig komplexitet och redundans.</p>\n</section>\n<section id=\"getting-the-current-domain-for-full-urls\">\n<h3>Hämta den aktuella domänen för fullständiga webbadresser<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>Djangos konvention <code class=\"docutils literal notranslate\"><span class=\"pre\">get_absolute_url()</span></code> är bra för att få dina objekts URL utan domännamnet, men i vissa fall kanske du vill visa den fullständiga URL:en - med <code class=\"docutils literal notranslate\"><span class=\"pre\">https://</span></code> och domänen och allt - för ett objekt. För att göra detta kan du använda webbplatsramverket. Ett exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console 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=\"s2\">&quot;https://</span><span class=\"si\">%s%s</span><span class=\"s2\">&quot;</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>Möjliggörande av ramverket för webbplatser<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>Följ dessa steg för att aktivera ramverket för webbplatser:</p>\n<ol class=\"arabic\">\n<li><p>Lägg till <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.sites'</span></code> i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p></li>\n<li><p>Definiera en <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>-inställning:</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>Kör <a class=\"reference internal\" href=\"/sv/6.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> registrerar en <a class=\"reference internal\" href=\"/sv/6.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> signalhanterare som skapar en standardwebbplats med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code> med domänen <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com</span></code>. Denna webbplats kommer också att skapas efter att Django skapar testdatabasen. För att ställa in rätt namn och domän för ditt projekt kan du använda en <a class=\"reference internal\" href=\"/sv/6.1/topics/migrations/#data-migrations\"><span class=\"std std-ref\">datamigrering</span></a>.</p>\n<p>För att kunna betjäna olika webbplatser i produktionen skulle du skapa en separat inställningsfil med varje <code class=\"docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code> (kanske importera från en gemensam inställningsfil för att undvika att duplicera delade inställningar) och sedan ange lämplig <span class=\"target\" id=\"index-2\"></span><a class=\"reference internal\" href=\"/sv/6.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> för varje webbplats.</p>\n</section>\n<section id=\"caching-the-current-site-object\">\n<h2>Cachelagring av det aktuella <code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span></code>-objektet<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>Eftersom den aktuella webbplatsen lagras i databasen kan varje anrop till <code class=\"docutils literal notranslate\"><span class=\"pre\">Site.objects.get_current()</span></code> resultera i en databasfråga. Men Django är lite smartare än så: vid den första begäran cachelagras den aktuella webbplatsen och alla efterföljande anrop returnerar de cachelagrade data istället för att slå i databasen.</p>\n<p>Om du av någon anledning vill tvinga fram en databasfråga kan du be Django att rensa cachen med hjälp av <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>Den ”aktuella webbplatsadministratören<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>Om <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> spelar en nyckelroll i din applikation, överväg att använda den användbara <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> i dina modeller. Det är en modell <a class=\"reference internal\" href=\"/sv/6.1/topics/db/managers/\"><span class=\"doc\">manager</span></a> som automatiskt filtrerar sina frågor för att endast inkludera objekt som är associerade med den aktuella <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\">Obligatorisk <a class=\"reference internal\" href=\"/sv/6.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><code class=\"docutils literal notranslate\"><span class=\"pre\">CurrentSiteManager</span></code> är endast användbar när inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> är definierad i dina inställningar.</p>\n</aside>\n<p>Använd <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> genom att uttryckligen lägga till den i din modell. Till exempel:</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\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=\"s2\">&quot;photos&quot;</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>Med den här modellen kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.objects.all()</span></code> att returnera alla <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code>-objekt i databasen, men <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo.on_site.all()</span></code> kommer endast att returnera de <code class=\"docutils literal notranslate\"><span class=\"pre\">Photo</span></code>-objekt som är associerade med den aktuella webbplatsen, enligt inställningen <a class=\"reference internal\" href=\"/sv/6.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>Uttryckt på ett annat sätt är dessa två påståenden likvärdiga:</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\neither a <a class=\"reference internal\" href=\"/sv/6.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=\"/sv/6.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\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=\"s2\">&quot;photos&quot;</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=\"s2\">&quot;publish_on&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om du försöker använda <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> och skickar ett fältnamn som inte finns, kommer Django att göra ett <code class=\"docutils literal notranslate\"><span class=\"pre\">ValueError</span></code>.</p>\n<p>Slutligen, notera att du förmodligen vill behålla en normal (icke-platsspecifik) <code class=\"docutils literal notranslate\"><span class=\"pre\">Manager</span></code> på din modell, även om du använder <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>. Som förklaras i <a class=\"reference internal\" href=\"/sv/6.1/topics/db/managers/\"><span class=\"doc\">manager documentation</span></a>, om du definierar en manager manuellt, kommer Django inte att skapa den automatiska <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code>-managern åt dig. Observera också att vissa delar av Django - nämligen Djangos administratörssida och generiska vyer - använder den hanterare som definieras <em>först</em> i modellen, så om du vill att din administratörssida ska ha tillgång till alla objekt (inte bara platsspecifika), lägg till <code class=\"docutils literal notranslate\"><span class=\"pre\">objects</span> <span class=\"pre\">=</span> <span class=\"pre\">models.Manager()</span></code> i din modell innan du definierar <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>Middleware för webbplatsen<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>Om du ofta använder detta mönster:</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\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>För att undvika upprepningar, lägg till <a class=\"reference internal\" href=\"/sv/6.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> till <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>. Middlewaret ställer in attributet <code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> på varje request-objekt, så att du kan använda <code class=\"docutils literal notranslate\"><span class=\"pre\">request.site</span></code> för att hämta den aktuella webbplatsen.</p>\n</section>\n<section id=\"how-django-uses-the-sites-framework\">\n<h2>Hur Django använder ramverket för webbplatser<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>Även om det inte krävs att du använder webbplatsramverket, uppmuntras det starkt, eftersom Django utnyttjar det på några ställen. Även om din Django-installation bara driver en enda webbplats, bör du ta de två sekunderna för att skapa webbplatsobjektet med din <code class=\"docutils literal notranslate\"><span class=\"pre\">domän</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">namn</span></code> och peka på dess ID i din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>-inställning.</p>\n<p>Så här använder Django ramverket för webbplatser:</p>\n<ul class=\"simple\">\n<li><p>I <a class=\"reference internal\" href=\"/sv/6.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-ramverket</span></code></a> är varje redirect-objekt associerat med en viss webbplats. När Django söker efter en omdirigering tar den hänsyn till den aktuella webbplatsen.</p></li>\n<li><p>I <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/flatpages/#module-django.contrib.flatpages\" title=\"django.contrib.flatpages: A framework for managing &quot;flat&quot; HTML content in a database.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">flatpages-ramverket</span></code></a> är varje flatpage associerad med en viss webbplats. När en flatpage skapas anger du dess <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>, och <a class=\"reference internal\" href=\"/sv/6.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> kontrollerar den aktuella webbplatsen för att hämta flatpages att visa.</p></li>\n<li><p>I <a class=\"reference internal\" href=\"/sv/6.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> har mallarna för <code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> automatiskt tillgång till en variabel <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">site</span> <span class=\"pre\">}}</span></code>, som är <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>-objektet som representerar den aktuella webbplatsen. Den hook för att tillhandahålla URL:er för objekt kommer också att använda <code class=\"docutils literal notranslate\"><span class=\"pre\">domän</span></code> från det aktuella <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>-objektet om du inte anger en fullständigt kvalificerad domän.</p></li>\n<li><p>I <a class=\"reference internal\" href=\"/sv/6.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\">autentiseringsramverket</span></code></a>, <a class=\"reference internal\" href=\"/sv/6.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> skickar det aktuella <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>-namnet till mallen som <code class=\"docutils literal notranslate\"><span class=\"pre\">{{site_name</span> <span class=\"pre\">}}</span></code>.</p></li>\n<li><p>Genvägsvyn (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.contenttypes.views.shortcut</span></code>) använder domänen för det aktuella <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>-objektet när den beräknar ett objekts URL.</p></li>\n<li><p>I admin-ramverket använder länken ”Visa på webbplatsen” den aktuella <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> för att räkna ut domänen för den webbplats som den kommer att omdirigera till.</p></li>\n</ul>\n</section>\n<section id=\"requestsite-objects\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code>-objekt<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\">Vissa <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/\"><span class=\"doc\">django.contrib</span></a> applikationer drar nytta av sites-ramverket men är uppbyggda på ett sätt som inte <em>kräver</em> att sites-ramverket installeras i din databas. (Vissa människor vill inte, eller kan inte <em>installera</em> den extra databastabell som sites-ramverket kräver) För dessa fall tillhandahåller ramverket en <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>-klass, som kan användas som en reserv när det databasstödda sites-ramverket inte är tillgängligt.</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>En klass som delar det primära gränssnittet för <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> (dvs. den har attributen <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>) men hämtar sina data från ett Django <a class=\"reference internal\" href=\"/sv/6.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>-objekt snarare än från en databas.</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>Ställer in attributen <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> till värdet av <a class=\"reference internal\" href=\"/sv/6.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=\"/sv/6.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>genväg till <code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_site</span></code><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>Slutligen, för att undvika repetitiv fallback-kod, tillhandahåller ramverket en <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>-funktion.</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>En funktion som kontrollerar om <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> är installerat och returnerar antingen det aktuella <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>-objektet eller ett <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>-objekt baserat på begäran. Den letar upp den aktuella webbplatsen baserat på <a class=\"reference internal\" href=\"/sv/6.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> om inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> inte är definierad.</p>\n<p>Både en domän och en port kan returneras av <a class=\"reference internal\" href=\"/sv/6.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> när Host-headern har en port uttryckligen angiven, t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">example.com:80</span></code>. I sådana fall, om uppslagningen misslyckas eftersom värden inte matchar en post i databasen, tas porten bort och uppslagningen görs om med endast domändelen. Detta gäller inte för <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> som alltid kommer att använda den omodifierade värden.</p>\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.sites","toc":[{"title":"Exempel på användning","anchor":"example-usage","children":[{"title":"Koppla innehåll till flera webbplatser","anchor":"associating-content-with-multiple-sites","children":[]},{"title":"Koppla innehåll till en enskild webbplats","anchor":"associating-content-with-a-single-site","children":[]},{"title":"Ansluta till den aktuella webbplatsen från vyer","anchor":"hooking-into-the-current-site-from-views","children":[]},{"title":"Hämta den aktuella domänen för visning","anchor":"getting-the-current-domain-for-display","children":[]},{"title":"Hämta den aktuella domänen för fullständiga webbadresser","anchor":"getting-the-current-domain-for-full-urls","children":[]}]},{"title":"Möjliggörande av ramverket för webbplatser","anchor":"enabling-the-sites-framework","children":[]},{"title":"Cachelagring av det aktuella Site-objektet","anchor":"caching-the-current-site-object","children":[]},{"title":"Den ”aktuella webbplatsadministratören","anchor":"the-currentsitemanager","children":[]},{"title":"Middleware för webbplatsen","anchor":"site-middleware","children":[]},{"title":"Hur Django använder ramverket för webbplatser","anchor":"how-django-uses-the-sites-framework","children":[]},{"title":"RequestSite-objekt","anchor":"requestsite-objects","children":[]},{"title":"genväg till get_current_site","anchor":"get-current-site-shortcut","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API-referens","url":"/sv/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib paket","url":"/sv/6.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/sitemaps","title":"Ramverket för webbplatskartor","url":"/sv/6.1/ref/contrib/sitemaps/"},"next":{"docname":"ref/contrib/staticfiles","title":"Appen ”statiska filer","url":"/sv/6.1/ref/contrib/staticfiles/"},"formats":{"html":"/sv/6.1/ref/contrib/sites/","markdown":"/sv/6.1/ref/contrib/sites.md","json":"/sv/6.1/ref/contrib/sites.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/sites.txt","official":"https://docs.djangoproject.com/sv/6.1/ref/contrib/sites/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}