{"title":"Ramverk för systemkontroll","version":"6.0","locale":"sv","docname":"topics/checks","url":"/sv/6.0/topics/checks/","canonical":"https://djangodocs.dev/sv/6.0/topics/checks/","summary":"Ramverket System Check är en uppsättning statiska kontroller för validering av Django-projekt.","html":"<span id=\"system-check-framework\"></span><h1>Ramverk för systemkontroll<a class=\"heading-anchor\" href=\"#module-django.core.checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ramverket System Check är en uppsättning statiska kontroller för validering av Django-projekt. Det upptäcker vanliga problem och ger tips om hur man åtgärdar dem. Ramverket är utbyggbart så att du enkelt kan lägga till dina egna kontroller.</p>\n<p>Kontroller kan utlösas explicit via kommandot <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">check</code></a>. Kontroller utlöses implicit före de flesta kommandon, inklusive <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a> och <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a>. Av prestandaskäl körs inte kontrollerna som en del av WSGI-stacken som används vid distributionen. Om du behöver köra systemkontroller på din distributionsserver ska du utlösa dem explicit med <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-check\"><code class=\"xref std std-djadmin docutils literal notranslate\">check</code></a>.</p>\n<p>Allvarliga fel förhindrar Django-kommandon (t.ex. <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django-admin-runserver\"><code class=\"xref std std-djadmin docutils literal notranslate\">runserver</code></a>) från att köras överhuvudtaget. Mindre problem rapporteras till konsolen. Om du har undersökt orsaken till en varning och gärna ignorerar den, kan du dölja specifika varningar med hjälp av inställningen <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS\"><code class=\"xref std std-setting docutils literal notranslate\">SILENCED_SYSTEM_CHECKS</code></a> i projektets inställningsfil.</p>\n<p>En fullständig lista över alla kontroller som kan ställas in av Django finns i <a class=\"reference internal\" href=\"/sv/6.0/ref/checks/\"><span class=\"doc\">Systemkontrollreferens</span></a>.</p>\n<section id=\"writing-your-own-checks\">\n<h2>Skriva ut dina egna checkar<a class=\"heading-anchor\" href=\"#writing-your-own-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ramverket är flexibelt och låter dig skriva funktioner som utför alla andra typer av kontroller som du kan tänkas behöva. Följande är ett exempel på en stubkontrollfunktion:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.checks</span> <span class=\"kn\">import</span> Error<span class=\"p\">,</span> register\n\n\n<span class=\"nd\">@register</span><span class=\"p\">()</span>\n<span class=\"k\">def</span> <span class=\"nf\">example_check</span><span class=\"p\">(</span>app_configs<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    errors <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"c1\"># ... your check logic here</span>\n    <span class=\"k\">if</span> check_failed<span class=\"p\">:</span>\n        errors<span class=\"o\">.</span>append<span class=\"p\">(</span>\n            Error<span class=\"p\">(</span>\n                <span class=\"s2\">&quot;an error&quot;</span><span class=\"p\">,</span>\n                hint<span class=\"o\">=</span><span class=\"s2\">&quot;A hint.&quot;</span><span class=\"p\">,</span>\n                obj<span class=\"o\">=</span>checked_object<span class=\"p\">,</span>\n                <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> errors\n</code></pre></div>\n<p>Check-funktionen <em>måste</em> acceptera ett <code class=\"docutils literal notranslate\">app_configs</code>-argument; detta argument är listan över applikationer som ska inspekteras. Om <code class=\"docutils literal notranslate\">None</code>, måste kontrollen köras på <em>alla</em> installerade appar i projektet.</p>\n<p>Kontrollen får ett argument i form av nyckelordet <code class=\"docutils literal notranslate\">databases</code>. Detta är en lista över databasalias vars anslutningar kan användas för att inspektera konfigurationen på databasnivå. Om <code class=\"docutils literal notranslate\">databases</code> är <code class=\"docutils literal notranslate\">None</code> får kontrollen inte använda några databasanslutningar.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">**kwargs</code> är nödvändigt för framtida expansion.</p>\n<section id=\"messages\">\n<h3>Meddelanden<a class=\"heading-anchor\" href=\"#messages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Funktionen måste returnera en lista med meddelanden. Om inga problem hittas som ett resultat av kontrollen, måste check-funktionen returnera en tom lista.</p>\n<p>De varningar och fel som checkmetoden ger upphov till måste vara instanser av <a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#django.core.checks.CheckMessage\" title=\"django.core.checks.CheckMessage\"><code class=\"xref py py-class docutils literal notranslate\">CheckMessage</code></a>. En instans av <a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#django.core.checks.CheckMessage\" title=\"django.core.checks.CheckMessage\"><code class=\"xref py py-class docutils literal notranslate\">CheckMessage</code></a> kapslar in ett enda rapporterbart fel eller varning. Det ger också sammanhang och tips som är tillämpliga på meddelandet och en unik identifierare som används för filtreringsändamål.</p>\n<p>Konceptet är mycket likt meddelanden från <a class=\"reference internal\" href=\"/sv/6.0/ref/contrib/messages/\"><span class=\"doc\">message framework</span></a> eller <a class=\"reference internal\" href=\"/sv/6.0/topics/logging/\"><span class=\"doc\">logging framework</span></a>. Meddelanden taggas med en <code class=\"docutils literal notranslate\">nivå</code> som anger hur allvarligt meddelandet är.</p>\n<p>Det finns också genvägar som gör det enklare att skapa meddelanden med gemensamma nivåer. När du använder dessa klasser kan du utelämna argumentet <code class=\"docutils literal notranslate\">level</code> eftersom det är underförstått av klassnamnet.</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#django.core.checks.Debug\" title=\"django.core.checks.Debug\"><code class=\"xref py py-class docutils literal notranslate\">Debug</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#django.core.checks.Info\" title=\"django.core.checks.Info\"><code class=\"xref py py-class docutils literal notranslate\">Info</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#django.core.checks.Warning\" title=\"django.core.checks.Warning\"><code class=\"xref py py-class docutils literal notranslate\">Warning</code></a></p></li>\n<li><p><code class=\"xref py py-class docutils literal notranslate\">Fel</code></p></li>\n<li><p><code class=\"xref py py-class docutils literal notranslate\">Kritisk</code></p></li>\n</ul>\n</section>\n<section id=\"registering-and-labeling-checks\">\n<span id=\"registering-labeling-checks\"></span><h3>Registrering och märkning av kontroller<a class=\"heading-anchor\" href=\"#registering-and-labeling-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Slutligen måste din kontrollfunktion registreras uttryckligen med systemets kontrollregister. Kontroller bör registreras i en fil som laddas när din applikation laddas; till exempel i metoden <a class=\"reference internal\" href=\"/sv/6.0/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">AppConfig.ready()</code></a>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.checks.register\">\n<span class=\"sig-name descname\">register</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">*tags)(function</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.checks.register\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Du kan skicka så många taggar till <code class=\"docutils literal notranslate\">register</code> som du vill för att märka din kontroll. Att märka kontroller är användbart eftersom det gör att du bara kan köra en viss grupp av kontroller. Om du t.ex. vill registrera en kompatibilitetskontroll gör du följande anrop:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.checks</span> <span class=\"kn\">import</span> register<span class=\"p\">,</span> Tags\n\n\n<span class=\"nd\">@register</span><span class=\"p\">(</span>Tags<span class=\"o\">.</span>compatibility<span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_check</span><span class=\"p\">(</span>app_configs<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"c1\"># ... perform compatibility checks and collect errors</span>\n    <span class=\"k\">return</span> errors\n</code></pre></div>\n<p>Du kan registrera ”deployment checks” som endast är relevanta för en produktionsinställningsfil på följande sätt:</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=\"nd\">@register</span><span class=\"p\">(</span>Tags<span class=\"o\">.</span>security<span class=\"p\">,</span> deploy<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_check</span><span class=\"p\">(</span>app_configs<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Dessa kontroller kommer endast att köras om alternativet <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#cmdoption-check-deploy\"><code class=\"xref std std-option docutils literal notranslate\">check --deploy</code></a> används.</p>\n<p>Du kan också använda <code class=\"docutils literal notranslate\">register</code> som en funktion i stället för en dekorator genom att skicka ett anropsbart objekt (vanligtvis en funktion) som första argument till <code class=\"docutils literal notranslate\">register</code>.</p>\n<p>Koden nedan är likvärdig med koden ovan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_check</span><span class=\"p\">(</span>app_configs<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\nregister<span class=\"p\">(</span>my_check<span class=\"p\">,</span> Tags<span class=\"o\">.</span>security<span class=\"p\">,</span> deploy<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"field-constraint-model-manager-template-engine-task-and-database-checks\">\n<span id=\"field-checking\"></span><h3>Field, constraint, model, manager, template engine, task, and database checks<a class=\"heading-anchor\" href=\"#field-constraint-model-manager-template-engine-task-and-database-checks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>I vissa fall behöver du inte registrera din checkfunktion - du kan använda dig av en befintlig registrering.</p>\n<p>Fields, constraints, models, model managers, template engines, task backends,\nand database backends all implement a <code class=\"docutils literal notranslate\">check()</code> method that is already\nregistered with the check framework. If you want to add extra checks, you can\nextend the implementation on the base class, perform any extra checks you need,\nand append any messages to those generated by the base class. It’s recommended\nthat you delegate each check to separate methods.</p>\n<p>Tänk på ett exempel där du implementerar ett anpassat fält med namnet <code class=\"docutils literal notranslate\">RangedIntegerField</code>. Det här fältet lägger till argumenten <code class=\"docutils literal notranslate\">min</code> och <code class=\"docutils literal notranslate\">max</code> i konstruktören för <code class=\"docutils literal notranslate\">IntegerField</code>. Du kanske vill lägga till en kontroll för att se till att användarna anger ett min-värde som är mindre än eller lika med max-värdet. Följande kodutdrag visar hur du kan implementera denna kontroll:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core</span> <span class=\"kn\">import</span> checks\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">RangedIntegerField</span><span class=\"p\">(</span>models<span class=\"o\">.</span>IntegerField<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"nb\">min</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"nb\">max</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>min <span class=\"o\">=</span> <span class=\"nb\">min</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>max <span class=\"o\">=</span> <span class=\"nb\">max</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Call the superclass</span>\n        errors <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>check<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n        <span class=\"c1\"># Do some custom checks and add messages to `errors`:</span>\n        errors<span class=\"o\">.</span>extend<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>_check_min_max_values<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">))</span>\n\n        <span class=\"c1\"># Return all errors and warnings</span>\n        <span class=\"k\">return</span> errors\n\n    <span class=\"k\">def</span> <span class=\"nf\">_check_min_max_values</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>min <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span>max <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span> <span class=\"ow\">and</span> <span class=\"bp\">self</span><span class=\"o\">.</span>min <span class=\"o\">&gt;</span> <span class=\"bp\">self</span><span class=\"o\">.</span>max<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[</span>\n                checks<span class=\"o\">.</span>Error<span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;min greater than max.&quot;</span><span class=\"p\">,</span>\n                    hint<span class=\"o\">=</span><span class=\"s2\">&quot;Decrease min or increase max.&quot;</span><span class=\"p\">,</span>\n                    obj<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"p\">,</span>\n                    <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n                <span class=\"p\">)</span>\n            <span class=\"p\">]</span>\n        <span class=\"c1\"># When no error, return an empty list</span>\n        <span class=\"k\">return</span> <span class=\"p\">[]</span>\n</code></pre></div>\n<p>Om du vill lägga till kontroller till en modellhanterare skulle du använda samma tillvägagångssätt på din underklass av <a class=\"reference internal\" href=\"/sv/6.0/topics/db/managers/#django.db.models.Manager\" title=\"django.db.models.Manager\"><code class=\"xref py py-class docutils literal notranslate\">Manager</code></a>.</p>\n<p>Om du vill lägga till en kontroll i en modellklass är tillvägagångssättet <em>nästan</em> detsamma: den enda skillnaden är att kontrollen är en klassmetod, inte en instansmetod:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"nd\">@classmethod</span>\n    <span class=\"k\">def</span> <span class=\"nf\">check</span><span class=\"p\">(</span><span class=\"bp\">cls</span><span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        errors <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>check<span class=\"p\">(</span><span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n        <span class=\"c1\"># ... your own checks ...</span>\n        <span class=\"k\">return</span> errors\n</code></pre></div>\n<aside class=\"version-note version-changed\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p>In older versions, constraints didn’t implement a <code class=\"docutils literal notranslate\">check()</code> method.</p>\n</aside>\n</section>\n<section id=\"writing-tests\">\n<h3>Skriva tester<a class=\"heading-anchor\" href=\"#writing-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Meddelanden är jämförbara. Det gör att du enkelt kan skriva tester:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.checks</span> <span class=\"kn\">import</span> Error\n\nerrors <span class=\"o\">=</span> checked_object<span class=\"o\">.</span>check<span class=\"p\">()</span>\nexpected_errors <span class=\"o\">=</span> <span class=\"p\">[</span>\n    Error<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;an error&quot;</span><span class=\"p\">,</span>\n        hint<span class=\"o\">=</span><span class=\"s2\">&quot;A hint.&quot;</span><span class=\"p\">,</span>\n        obj<span class=\"o\">=</span>checked_object<span class=\"p\">,</span>\n        <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.E001&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n<span class=\"p\">]</span>\n<span class=\"bp\">self</span><span class=\"o\">.</span>assertEqual<span class=\"p\">(</span>errors<span class=\"p\">,</span> expected_errors<span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"writing-integration-tests\">\n<h4>Skriva integrationstester<a class=\"heading-anchor\" href=\"#writing-integration-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Med tanke på behovet av att registrera vissa kontroller när applikationen laddas kan det vara användbart att testa deras integration inom ramverket för systemkontroller. Detta kan åstadkommas genom att använda funktionen <a class=\"reference internal\" href=\"/sv/6.0/ref/django-admin/#django.core.management.call_command\" title=\"django.core.management.call_command\"><code class=\"xref py py-func docutils literal notranslate\">call_command()</code></a>.</p>\n<p>Det här testet visar till exempel att inställningen <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\">SITE_ID</code></a> måste vara ett heltal, en inbyggd <a class=\"reference internal\" href=\"/sv/6.0/ref/checks/#sites-system-checks\"><span class=\"std std-ref\">check från sites-ramverket</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.management</span> <span class=\"kn\">import</span> call_command\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.management.base</span> <span class=\"kn\">import</span> SystemCheckError\n<span class=\"kn\">from</span> <span class=\"nn\">django.test</span> <span class=\"kn\">import</span> SimpleTestCase<span class=\"p\">,</span> modify_settings<span class=\"p\">,</span> override_settings\n\n\n<span class=\"k\">class</span> <span class=\"nc\">SystemCheckIntegrationTest</span><span class=\"p\">(</span>SimpleTestCase<span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span>SITE_ID<span class=\"o\">=</span><span class=\"s2\">&quot;non_integer&quot;</span><span class=\"p\">)</span>\n    <span class=\"nd\">@modify_settings</span><span class=\"p\">(</span>INSTALLED_APPS<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;prepend&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.contrib.sites&quot;</span><span class=\"p\">})</span>\n    <span class=\"k\">def</span> <span class=\"nf\">test_non_integer_site_id</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        message <span class=\"o\">=</span> <span class=\"s2\">&quot;(sites.E101) The SITE_ID setting must be an integer.&quot;</span>\n        <span class=\"k\">with</span> <span class=\"bp\">self</span><span class=\"o\">.</span>assertRaisesMessage<span class=\"p\">(</span>SystemCheckError<span class=\"p\">,</span> message<span class=\"p\">):</span>\n            call_command<span class=\"p\">(</span><span class=\"s2\">&quot;check&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Tänk på följande kontroll som ger en varning vid distribution om en anpassad inställning med namnet <code class=\"docutils literal notranslate\">ENABLE_ANALYTICS</code> inte är inställd på <code class=\"docutils literal notranslate\">True</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=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.checks</span> <span class=\"kn\">import</span> <span class=\"ne\">Warning</span><span class=\"p\">,</span> register\n\n\n<span class=\"nd\">@register</span><span class=\"p\">(</span><span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> deploy<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">check_enable_analytics_is_true_on_deploy</span><span class=\"p\">(</span>app_configs<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    errors <span class=\"o\">=</span> <span class=\"p\">[]</span>\n    <span class=\"k\">if</span> <span class=\"nb\">getattr</span><span class=\"p\">(</span>settings<span class=\"p\">,</span> <span class=\"s2\">&quot;ENABLE_ANALYTICS&quot;</span><span class=\"p\">,</span> <span class=\"kc\">None</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">True</span><span class=\"p\">:</span>\n        errors<span class=\"o\">.</span>append<span class=\"p\">(</span>\n            <span class=\"ne\">Warning</span><span class=\"p\">(</span>\n                <span class=\"s2\">&quot;The ENABLE_ANALYTICS setting should be set to True in deployment.&quot;</span><span class=\"p\">,</span>\n                <span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"s2\">&quot;myapp.W001&quot;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n        <span class=\"p\">)</span>\n    <span class=\"k\">return</span> errors\n</code></pre></div>\n<p>Med tanke på att denna kontroll inte kommer att ge upphov till ett <code class=\"docutils literal notranslate\">SystemCheckError</code>, kan förekomsten av varningsmeddelandet i <code class=\"docutils literal notranslate\">stderr</code>-utdata hävdas på följande sätt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">io</span> <span class=\"kn\">import</span> StringIO\n\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.management</span> <span class=\"kn\">import</span> call_command\n<span class=\"kn\">from</span> <span class=\"nn\">django.test</span> <span class=\"kn\">import</span> SimpleTestCase<span class=\"p\">,</span> override_settings\n\n\n<span class=\"k\">class</span> <span class=\"nc\">EnableAnalyticsDeploymentCheckTest</span><span class=\"p\">(</span>SimpleTestCase<span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span>ENABLE_ANALYTICS<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">test_when_set_to_none</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        stderr <span class=\"o\">=</span> StringIO<span class=\"p\">()</span>\n        call_command<span class=\"p\">(</span><span class=\"s2\">&quot;check&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;-t&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;myapp&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;--deploy&quot;</span><span class=\"p\">,</span> stderr<span class=\"o\">=</span>stderr<span class=\"p\">)</span>\n        message <span class=\"o\">=</span> <span class=\"p\">(</span>\n            <span class=\"s2\">&quot;(myapp.W001) The ENABLE_ANALYTICS setting should be set &quot;</span>\n            <span class=\"s2\">&quot;to True in deployment.&quot;</span>\n        <span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>assertIn<span class=\"p\">(</span>message<span class=\"p\">,</span> stderr<span class=\"o\">.</span>getvalue<span class=\"p\">())</span>\n</code></pre></div>\n</section>\n</section>\n</section>","rootId":"module-django.core.checks","toc":[{"title":"Skriva ut dina egna checkar","anchor":"writing-your-own-checks","children":[{"title":"Meddelanden","anchor":"messages","children":[]},{"title":"Registrering och märkning av kontroller","anchor":"registering-and-labeling-checks","children":[]},{"title":"Field, constraint, model, manager, template engine, task, and database checks","anchor":"field-constraint-model-manager-template-engine-task-and-database-checks","children":[]},{"title":"Skriva tester","anchor":"writing-tests","children":[{"title":"Skriva integrationstester","anchor":"writing-integration-tests","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"}],"prev":{"docname":"topics/signals","title":"Signaler","url":"/sv/6.0/topics/signals/"},"next":{"docname":"topics/external-packages","title":"Externa paket","url":"/sv/6.0/topics/external-packages/"},"formats":{"html":"/sv/6.0/topics/checks/","markdown":"/sv/6.0/topics/checks.md","json":"/sv/6.0/topics/checks.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/checks.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/checks/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}