{"title":"Validering av formulär och fält","version":"6.1","locale":"sv","docname":"ref/forms/validation","url":"/sv/6.1/ref/forms/validation/","canonical":"https://djangodocs.dev/sv/6.1/ref/forms/validation/","summary":"Formulärvalidering sker när data rensas. Om du vill anpassa den här processen finns det olika platser där du kan göra ändringar, var och en med olika syften.","html":"<h1>Validering av formulär och fält<a class=\"heading-anchor\" href=\"#form-and-field-validation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Formulärvalidering sker när data rensas. Om du vill anpassa den här processen finns det olika platser där du kan göra ändringar, var och en med olika syften. Tre typer av rengöringsmetoder körs under formulärbehandlingen. Dessa körs normalt när du anropar metoden <code class=\"docutils literal notranslate\">is_valid()</code> på ett formulär. Det finns andra saker som också kan utlösa rengöring och validering (åtkomst till attributet <code class=\"docutils literal notranslate\">errors</code> eller direkt anrop av <code class=\"docutils literal notranslate\">full_clean()</code>)), men normalt sett behövs de inte.</p>\n<p>I allmänhet kan varje rengöringsmetod höja <code class=\"docutils literal notranslate\">ValidationError</code> om det finns ett problem med de data den bearbetar, och skicka relevant information till <code class=\"docutils literal notranslate\">ValidationError</code>-konstruktören. <a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">Se nedan</span></a> för bästa praxis för att höja <code class=\"docutils literal notranslate\">ValidationError</code>. Om inget <code class=\"docutils literal notranslate\">ValidationError</code> uppstår bör metoden returnera de rensade (normaliserade) data som ett Python-objekt.</p>\n<p>Den mesta valideringen kan göras med hjälp av <a class=\"reference internal\" href=\"#validators\">validatorer</a> - hjälpare som kan återanvändas. Validerare är funktioner (eller anropsbara) som tar ett enda argument och ger upphov till <code class=\"docutils literal notranslate\">ValidationError</code> vid ogiltig indata. Validerare körs efter att fältets metoder <code class=\"docutils literal notranslate\">to_python</code> och <code class=\"docutils literal notranslate\">validate</code> har anropats.</p>\n<p>Valideringen av ett formulär är uppdelad i flera steg, som kan anpassas eller åsidosättas:</p>\n<ul>\n<li><p>Metoden <code class=\"docutils literal notranslate\">to_python()</code> på en <code class=\"docutils literal notranslate\">Field</code> är det första steget i varje validering. Den tvingar värdet till en korrekt datatyp och ger upphov till <code class=\"docutils literal notranslate\">ValidationError</code> om det inte är möjligt. Den här metoden tar emot det råa värdet från widgeten och returnerar det konverterade värdet. Till exempel: kommer en <code class=\"docutils literal notranslate\">FloatField</code> att omvandla data till en Python <code class=\"docutils literal notranslate\">float</code> eller ge upphov till ett <code class=\"docutils literal notranslate\">ValidationError</code>.</p></li>\n<li><p>Metoden <code class=\"docutils literal notranslate\">validate()</code> för en <code class=\"docutils literal notranslate\">Field</code> hanterar fältspecifik validering som inte lämpar sig för en validerare. Den tar ett värde som har tvingats till en korrekt datatyp och ger upphov till <code class=\"docutils literal notranslate\">ValidationError</code> vid eventuella fel. Den här metoden returnerar ingenting och bör inte ändra värdet. Du bör åsidosätta den för att hantera valideringslogik som du inte kan eller vill lägga in i en validator.</p></li>\n<li><p>Metoden <code class=\"docutils literal notranslate\">run_validators()</code> på ett <code class=\"docutils literal notranslate\">Field</code> kör alla fältets validatorer och aggregerar alla fel till ett enda <code class=\"docutils literal notranslate\">ValidationError</code>. Du ska inte behöva åsidosätta den här metoden.</p></li>\n<li><p>Metoden <code class=\"docutils literal notranslate\">clean()</code> i en subklass av <code class=\"docutils literal notranslate\">Field</code> är ansvarig för att köra <code class=\"docutils literal notranslate\">to_python()</code>, <code class=\"docutils literal notranslate\">validate()</code> och <code class=\"docutils literal notranslate\">run_validators()</code> i rätt ordning och sprida deras fel. Om någon av metoderna vid något tillfälle ger upphov till <code class=\"docutils literal notranslate\">ValidationError</code>, stoppas valideringen och det felet anges. Denna metod returnerar de rena uppgifterna, som sedan infogas i formulärets ordbok <code class=\"docutils literal notranslate\">cleaned_data</code>.</p></li>\n<li><p>Metoden <code class=\"docutils literal notranslate\">clean_&lt;fieldname&gt;()</code> anropas på en formulärunderklass – där <code class=\"docutils literal notranslate\">&lt;fieldname&gt;</code> ersätts med namnet på formulärfältets attribut. Denna metod utför all rengöring som är specifik för det specifika attributet, oberoende av vilken typ av fält det är. Den här metoden får inga parametrar. Du måste leta upp värdet på fältet i <code class=\"docutils literal notranslate\">self.cleaned_data</code> och komma ihåg att det kommer att vara ett Python-objekt vid denna tidpunkt, inte den ursprungliga strängen som skickades in i formuläret (det kommer att vara i <code class=\"docutils literal notranslate\">cleaned_data</code> eftersom den allmänna fältmetoden <code class=\"docutils literal notranslate\">clean()</code> ovan redan har rensat data en gång).</p>\n<p>Om du till exempel vill validera att innehållet i en <code class=\"docutils literal notranslate\">CharField</code> som heter <code class=\"docutils literal notranslate\">serialnumber</code> är unikt, skulle <code class=\"docutils literal notranslate\">clean_serialnumber()</code> vara rätt plats att göra detta. Du behöver inte ett specifikt fält (det är en <code class=\"docutils literal notranslate\">CharField</code>), men du vill ha en formulärfältsspecifik del av valideringen och eventuellt rensa/normera data.</p>\n<p>Returvärdet för den här metoden ersätter det befintliga värdet i <code class=\"docutils literal notranslate\">cleaned_data</code>, så det måste vara fältets värde från <code class=\"docutils literal notranslate\">cleaned_data</code> (även om den här metoden inte ändrade det) eller ett nytt rensat värde.</p>\n</li>\n<li><p>Metoden <code class=\"docutils literal notranslate\">clean()</code> i formulärunderklassen kan utföra validering som kräver åtkomst till flera formulärfält. Det är här du kan lägga in kontroller som ”om fält <code class=\"docutils literal notranslate\">A</code> anges, måste fält <code class=\"docutils literal notranslate\">B</code> innehålla en giltig e-postadress”. Den här metoden kan returnera en helt annan ordbok om den vill, som kommer att användas som <code class=\"docutils literal notranslate\">cleaned_data</code>.</p>\n<p>Eftersom fältvalideringsmetoderna har körts när <code class=\"docutils literal notranslate\">clean()</code> anropas, har du också tillgång till formulärets <code class=\"docutils literal notranslate\">errors</code>-attribut som innehåller alla fel som uppstått vid rensning av enskilda fält.</p>\n<p>Observera att fel som utlöses av åsidosättningen av <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">Form.clean()</code></a> inte kopplas till något specifikt fält. De hamnar i ett särskilt ”fält” (kallat <code class=\"docutils literal notranslate\">__all__</code>), som du kan komma åt via metoden <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.non_field_errors\" title=\"django.forms.Form.non_field_errors\"><code class=\"xref py py-meth docutils literal notranslate\">non_field_errors()</code></a> vid behov. Om du vill koppla fel till ett specifikt fält i formuläret måste du anropa <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.add_error\" title=\"django.forms.Form.add_error\"><code class=\"xref py py-meth docutils literal notranslate\">add_error()</code></a>.</p>\n<p>Observera också att det finns särskilda överväganden när du åsidosätter <code class=\"docutils literal notranslate\">clean()</code>-metoden för en <code class=\"docutils literal notranslate\">ModelForm</code>-underklass. (se <a class=\"reference internal\" href=\"/sv/6.1/topics/forms/modelforms/#overriding-modelform-clean-method\"><span class=\"std std-ref\">ModelForm dokumentation</span></a> för mer information)</p>\n</li>\n</ul>\n<p>Dessa metoder körs i den ordning som anges ovan, ett fält i taget. För varje fält i formuläret (i den ordning de deklareras i formulärdefinitionen) körs alltså metoden <code class=\"docutils literal notranslate\">Field.clean()</code> (eller dess åsidosättning), följt av <code class=\"docutils literal notranslate\">clean_&lt;fieldname&gt;()</code>. När dessa två metoder slutligen har körts för varje fält körs metoden <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">Form.clean()</code></a>, eller dess åsidosättning, oavsett om de tidigare metoderna har utlöst fel eller inte.</p>\n<p>Exempel på var och en av dessa metoder ges nedan.</p>\n<p>Som nämnts kan någon av dessa metoder ge upphov till ett <code class=\"docutils literal notranslate\">ValidationError</code>. För ett fält, om metoden <code class=\"docutils literal notranslate\">Field.clean()</code> ger upphov till ett <code class=\"docutils literal notranslate\">ValidationError</code>, anropas inte någon fältspecifik rengöringsmetod. Rengöringsmetoderna för alla återstående fält körs dock fortfarande.</p>\n<section id=\"raising-validationerror\">\n<span id=\"raising-validation-error\"></span><h2>Upphävande av <code class=\"docutils literal notranslate\">ValidationError</code><a class=\"heading-anchor\" href=\"#raising-validationerror\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För att felmeddelanden ska vara flexibla och lätta att åsidosätta bör du beakta följande riktlinjer:</p>\n<ul>\n<li><p>Ange en beskrivande fel-<code class=\"docutils literal notranslate\">code</code> till konstruktorn för att möjliggöra programmatisk användning (t.ex. i tester) som inte varierar med översättningar:</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\"># Good</span>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">),</span> code<span class=\"o\">=</span><span class=\"s2\">&quot;invalid&quot;</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</li>\n<li><p>Tvinga inte in variabler i meddelandet; använd platshållare och <code class=\"docutils literal notranslate\">params</code>-argumentet i konstruktören:</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\"># Good</span>\nValidationError<span class=\"p\">(</span>\n    _<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    params<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span> <span class=\"o\">%</span> value<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>Använd mappningsnycklar i stället för positionsformatering. Detta gör det möjligt att placera variablerna i vilken ordning som helst eller att utelämna dem helt och hållet när meddelandet skrivs om:</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\"># Good</span>\nValidationError<span class=\"p\">(</span>\n    _<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    params<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<span class=\"p\">(</span>\n    _<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    params<span class=\"o\">=</span><span class=\"p\">(</span><span class=\"s2\">&quot;42&quot;</span><span class=\"p\">,),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</li>\n<li><p>Omslut meddelandet med <code class=\"docutils literal notranslate\">gettext</code> för att möjliggöra översättning:</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\"># Good</span>\nValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">))</span>\n\n<span class=\"c1\"># Bad</span>\nValidationError<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Att sätta ihop allt:</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\">raise</span> ValidationError<span class=\"p\">(</span>\n    _<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%(value)s</span><span class=\"s2\">&quot;</span><span class=\"p\">),</span>\n    code<span class=\"o\">=</span><span class=\"s2\">&quot;invalid&quot;</span><span class=\"p\">,</span>\n    params<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;value&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;42&quot;</span><span class=\"p\">},</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Det är särskilt viktigt att följa dessa riktlinjer om du skriver återanvändbara formulär, formulärfält och modellfält.</p>\n<p>Även om det inte rekommenderas, om du är i slutet av valideringskedjan (dvs. ditt formulär <code class=\"docutils literal notranslate\">clean()</code>-metoden) och du vet att du <em>aldrig</em> kommer att behöva åsidosätta ditt felmeddelande kan du fortfarande välja den mindre verbala:</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>ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Invalid value: </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span> <span class=\"o\">%</span> value<span class=\"p\">)</span>\n</code></pre></div>\n<p>Metoderna <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.errors.as_data\" title=\"django.forms.Form.errors.as_data\"><code class=\"xref py py-meth docutils literal notranslate\">Form.errors.as_data()</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.errors.as_json\" title=\"django.forms.Form.errors.as_json\"><code class=\"xref py py-meth docutils literal notranslate\">Form.errors.as_json()</code></a> har stor nytta av fullt utrustade <code class=\"docutils literal notranslate\">ValidationError</code> (med ett <code class=\"docutils literal notranslate\">code</code>-namn och en <code class=\"docutils literal notranslate\">params</code>-ordbok).</p>\n<section id=\"raising-multiple-errors\">\n<h3>Upprepa flera fel<a class=\"heading-anchor\" href=\"#raising-multiple-errors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du upptäcker flera fel under en rensningsmetod och vill signalera dem alla till den som skickar in formuläret, är det möjligt att skicka en lista med fel till konstruktören <code class=\"docutils literal notranslate\">ValidationError</code>.</p>\n<p>Som ovan rekommenderas det att skicka en lista över <code class=\"docutils literal notranslate\">ValidationError</code>-instanser med <code class=\"docutils literal notranslate\">code</code> och <code class=\"docutils literal notranslate\">params</code> men en lista med strängar fungerar också:</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\"># Good</span>\n<span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Error 1&quot;</span><span class=\"p\">),</span> code<span class=\"o\">=</span><span class=\"s2\">&quot;error1&quot;</span><span class=\"p\">),</span>\n        ValidationError<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Error 2&quot;</span><span class=\"p\">),</span> code<span class=\"o\">=</span><span class=\"s2\">&quot;error2&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n<span class=\"p\">)</span>\n\n<span class=\"c1\"># Bad</span>\n<span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        _<span class=\"p\">(</span><span class=\"s2\">&quot;Error 1&quot;</span><span class=\"p\">),</span>\n        _<span class=\"p\">(</span><span class=\"s2\">&quot;Error 2&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">]</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"using-validation-in-practice\">\n<h2>Använda validering i praktiken<a class=\"heading-anchor\" href=\"#using-validation-in-practice\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>I de föregående avsnitten förklarades hur validering fungerar i allmänhet för formulär. Eftersom det ibland kan vara lättare att få saker på plats genom att se varje funktion användas, följer här en serie små exempel som använder var och en av de tidigare funktionerna.</p>\n<section id=\"using-validators\">\n<span id=\"validators\"></span><h3>Använda validerare<a class=\"heading-anchor\" href=\"#using-validators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Djangos formulär- (och modell-) fält stöder användning av verktygsfunktioner och klasser som kallas validerare. En validator är ett anropbart objekt eller en funktion som tar ett värde och returnerar ingenting om värdet är giltigt eller ger upphov till ett <a class=\"reference internal\" href=\"/sv/6.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\">ValidationError</code></a> om inte. Dessa kan skickas till ett fälts konstruktör, via fältets <code class=\"docutils literal notranslate\">validators</code> argument, eller definieras på <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/fields/#django.forms.Field\" title=\"django.forms.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a>-klassen själv med <code class=\"docutils literal notranslate\">default_validators</code>-attributet.</p>\n<p>Validatorer kan användas för att validera värden i fältet, låt oss ta en titt på Djangos <code class=\"docutils literal notranslate\">SlugField</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.core</span> <span class=\"kn\">import</span> validators\n<span class=\"kn\">from</span> <span class=\"nn\">django.forms</span> <span class=\"kn\">import</span> CharField\n\n\n<span class=\"k\">class</span> <span class=\"nc\">SlugField</span><span class=\"p\">(</span>CharField<span class=\"p\">):</span>\n    default_validators <span class=\"o\">=</span> <span class=\"p\">[</span>validators<span class=\"o\">.</span>validate_slug<span class=\"p\">]</span>\n</code></pre></div>\n<p>Som du kan se är <code class=\"docutils literal notranslate\">SlugField</code> en <code class=\"docutils literal notranslate\">CharField</code> med en anpassad validator som validerar att den inskickade texten följer vissa teckenregler. Detta kan också göras på fältdefinitionen 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>slug <span class=\"o\">=</span> forms<span class=\"o\">.</span>SlugField<span class=\"p\">()</span>\n</code></pre></div>\n<p>är likvärdig med:</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>slug <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>validators<span class=\"o\">=</span><span class=\"p\">[</span>validators<span class=\"o\">.</span>validate_slug<span class=\"p\">])</span>\n</code></pre></div>\n<p>Vanliga fall som validering mot ett e-postmeddelande eller ett reguljärt uttryck kan hanteras med hjälp av befintliga valideringsklasser som finns i Django. Till exempel: är <code class=\"docutils literal notranslate\">validators.validate_slug</code> en instans av en <a class=\"reference internal\" href=\"/sv/6.1/ref/validators/#django.core.validators.RegexValidator\" title=\"django.core.validators.RegexValidator\"><code class=\"xref py py-class docutils literal notranslate\">RegexValidator</code></a> konstruerad med det första argumentet som är mönstret: <code class=\"docutils literal notranslate\">^[-a-zA-Z0-9_]+\\Z</code>. Se avsnittet om <a class=\"reference internal\" href=\"/sv/6.1/ref/validators/\"><span class=\"doc\">Skriva validatorer</span></a> för att se en lista över vad som redan finns tillgängligt och för ett exempel på hur man skriver en validator.</p>\n</section>\n<section id=\"form-field-default-cleaning\">\n<h3>Standardrengöring av formulärfält<a class=\"heading-anchor\" href=\"#form-field-default-cleaning\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Låt oss först skapa ett anpassat formulärfält som validerar att dess inmatning är en sträng som innehåller kommaseparerade e-postadresser. Den fullständiga klassen ser ut 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.validators</span> <span class=\"kn\">import</span> validate_email\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MultiEmailField</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Field<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">to_python</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Normalize data to a list of strings.&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Return an empty list if no input was given.</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> value<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"p\">[]</span>\n        <span class=\"k\">return</span> value<span class=\"o\">.</span>split<span class=\"p\">(</span><span class=\"s2\">&quot;,&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">validate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> value<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;Check if value consists only of valid emails.&quot;&quot;&quot;</span>\n        <span class=\"c1\"># Use the parent&#39;s handling of required fields, etc.</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>validate<span class=\"p\">(</span>value<span class=\"p\">)</span>\n        <span class=\"k\">for</span> email <span class=\"ow\">in</span> value<span class=\"p\">:</span>\n            validate_email<span class=\"p\">(</span>email<span class=\"p\">)</span>\n</code></pre></div>\n<p>Varje formulär som använder det här fältet kommer att köra dessa metoder innan något annat kan göras med fältets data. Det här är en rengöring som är specifik för den här typen av fält, oavsett hur det sedan används.</p>\n<p>Låt oss skapa en <code class=\"docutils literal notranslate\">ContactForm</code> för att visa hur du använder det här fältet:</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\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    subject <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">100</span><span class=\"p\">)</span>\n    message <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">()</span>\n    contact_email <span class=\"o\">=</span> forms<span class=\"o\">.</span>EmailField<span class=\"p\">()</span>\n    recipients <span class=\"o\">=</span> MultiEmailField<span class=\"p\">()</span>\n    urgent <span class=\"o\">=</span> forms<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>required<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Använd <code class=\"docutils literal notranslate\">MultiEmailField</code> som vilket annat formulärfält som helst. När metoden <code class=\"docutils literal notranslate\">is_valid()</code> anropas på formuläret kommer metoden <code class=\"docutils literal notranslate\">MultiEmailField.clean()</code> att köras som en del av rengöringsprocessen och den kommer i sin tur att anropa de anpassade metoderna <code class=\"docutils literal notranslate\">to_python()</code> och <code class=\"docutils literal notranslate\">validate()</code>.</p>\n</section>\n<section id=\"cleaning-a-specific-field-attribute\">\n<h3>Rengöring av ett specifikt fältattribut<a class=\"heading-anchor\" href=\"#cleaning-a-specific-field-attribute\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Fortsätt från föregående exempel och anta att vi i vårt <code class=\"docutils literal notranslate\">ContactForm</code> vill säkerställa att fältet <code class=\"docutils literal notranslate\">recipients</code> endast innehåller adresser som är <code class=\"docutils literal notranslate\">&#64;example.com</code>. Detta är validering som är specifik för formuläret, så vi vill inte lägga den i den generella klassen <code class=\"docutils literal notranslate\">MultiEmailField</code>. I stället skriver vi en rensningsmetod som arbetar på fältet <code class=\"docutils literal notranslate\">recipients</code>, 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean_recipients</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        data <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;recipients&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"nb\">all</span><span class=\"p\">(</span>email<span class=\"o\">.</span>endswith<span class=\"p\">(</span><span class=\"s2\">&quot;@example.com&quot;</span><span class=\"p\">)</span> <span class=\"k\">for</span> email <span class=\"ow\">in</span> data<span class=\"p\">):</span>\n            <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span><span class=\"s2\">&quot;All recipients must be @example.com.&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Always return a value to use as the new cleaned data, even if</span>\n        <span class=\"c1\"># this method didn&#39;t change it.</span>\n        <span class=\"k\">return</span> data\n</code></pre></div>\n</section>\n<section id=\"cleaning-and-validating-fields-that-depend-on-each-other\">\n<span id=\"validating-fields-with-clean\"></span><h3>Rengöring och validering av fält som är beroende av varandra<a class=\"heading-anchor\" href=\"#cleaning-and-validating-fields-that-depend-on-each-other\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Anta att vi lägger till ytterligare ett krav för kontaktformuläret: om fältet <code class=\"docutils literal notranslate\">urgent</code> är <code class=\"docutils literal notranslate\">True</code> måste <code class=\"docutils literal notranslate\">subject</code> innehålla <code class=\"docutils literal notranslate\">&quot;help&quot;</code>. Vi utför validering av mer än ett fält åt gången, så formulärets metod <a class=\"reference internal\" href=\"/sv/6.1/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">clean()</code></a> är ett bra ställe att göra detta på. Observera att vi här talar om metoden <code class=\"docutils literal notranslate\">clean()</code> på formuläret, medan vi tidigare skrev en metod <code class=\"docutils literal notranslate\">clean()</code> på ett fält. Det är viktigt att hålla skillnaden mellan fält och formulär tydlig när man avgör var saker ska valideras. Fält är enskilda datapunkter, formulär är en samling fält.</p>\n<p>När formulärets <code class=\"docutils literal notranslate\">clean()</code>-metod anropas har alla enskilda fältrengöringsmetoder körts (de två föregående avsnitten), så <code class=\"docutils literal notranslate\">self.cleaned_data</code> kommer att fyllas i med alla data som har överlevt hittills. Så du måste också komma ihåg att ta hänsyn till det faktum att de fält du vill validera kanske inte har överlevt de första individuella fältkontrollerna.</p>\n<p>Det finns två sätt att rapportera eventuella fel från detta steg. Den vanligaste metoden är förmodligen att visa felet högst upp i formuläret. För att skapa ett sådant fel kan du skapa ett <code class=\"docutils literal notranslate\">ValidationError</code> från <code class=\"docutils literal notranslate\">clean()</code>-metoden. 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        cleaned_data <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        urgent <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;urgent&quot;</span><span class=\"p\">)</span>\n        subject <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> urgent <span class=\"ow\">and</span> subject<span class=\"p\">:</span>\n            <span class=\"c1\"># Only do something if both fields are valid so far.</span>\n            <span class=\"k\">if</span> <span class=\"s2\">&quot;help&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> subject<span class=\"p\">:</span>\n                <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span>\n                    <span class=\"s2\">&quot;Must put &#39;help&#39; in the subject for urgent requests.&quot;</span>\n                <span class=\"p\">)</span>\n</code></pre></div>\n<p>I den här koden visas ett felmeddelande högst upp i formuläret (normalt) som beskriver problemet om valideringsfelet uppstår. Sådana fel är icke-fältfel, som visas i mallen med <code class=\"docutils literal notranslate\">{{ form.non_field_errors }}</code>.</p>\n<p>Anropet till <code class=\"docutils literal notranslate\">super().clean()</code> i exempelkoden säkerställer att all valideringslogik i överordnade klasser bibehålls. Om ditt formulär ärver ett annat som inte returnerar en <code class=\"docutils literal notranslate\">cleaned_data</code>-ordbok i sin <code class=\"docutils literal notranslate\">clean()</code>-metod (att göra det är valfritt), tilldela då inte <code class=\"docutils literal notranslate\">cleaned_data</code> till resultatet av <code class=\"docutils literal notranslate\">super()</code>-anropet och använd <code class=\"docutils literal notranslate\">self.cleaned_data</code> istället:</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\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n    urgent <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;urgent&quot;</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Det andra sättet att rapportera valideringsfel kan innebära att felmeddelandet tilldelas ett av fälten. I detta fall tilldelar vi ett felmeddelande både raden ”subject” och raden ”urgent” i formulärvisningen. Var försiktig när du gör detta i praktiken, eftersom det kan leda till förvirrande formulärutdata. Här visar vi vad som är möjligt och lämnar åt dig och dina designers att avgöra vad som fungerar effektivt i din specifika situation. Vår nya kod (som ersätter det föregående exemplet) ser ut 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=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">ContactForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    <span class=\"c1\"># Everything as before.</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        cleaned_data <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean<span class=\"p\">()</span>\n        urgent <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;urgent&quot;</span><span class=\"p\">)</span>\n        subject <span class=\"o\">=</span> cleaned_data<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"k\">if</span> urgent <span class=\"ow\">and</span> subject <span class=\"ow\">and</span> <span class=\"s2\">&quot;help&quot;</span> <span class=\"ow\">not</span> <span class=\"ow\">in</span> subject<span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>add_error<span class=\"p\">(</span>\n                <span class=\"s2\">&quot;subject&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Must put &#39;help&#39; in the subject for urgent requests.&quot;</span>\n            <span class=\"p\">)</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>add_error<span class=\"p\">(</span>\n                <span class=\"s2\">&quot;urgent&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Must not mark urgent unless &#39;help&#39; is in the subject.&quot;</span>\n            <span class=\"p\">)</span>\n</code></pre></div>\n<p>Det andra argumentet i <code class=\"docutils literal notranslate\">add_error()</code> kan vara en sträng, eller helst en instans av <code class=\"docutils literal notranslate\">ValidationError</code>. Se <a class=\"reference internal\" href=\"#raising-validation-error\"><span class=\"std std-ref\">Upphävande av ValidationError</span></a> för mer information. Notera att <code class=\"docutils literal notranslate\">add_error()</code> automatiskt tar bort fältet från <code class=\"docutils literal notranslate\">cleaned_data</code>.</p>\n</section>\n</section>","rootId":"form-and-field-validation","toc":[{"title":"Upphävande av ValidationError","anchor":"raising-validationerror","children":[{"title":"Upprepa flera fel","anchor":"raising-multiple-errors","children":[]}]},{"title":"Använda validering i praktiken","anchor":"using-validation-in-practice","children":[{"title":"Använda validerare","anchor":"using-validators","children":[]},{"title":"Standardrengöring av formulärfält","anchor":"form-field-default-cleaning","children":[]},{"title":"Rengöring av ett specifikt fältattribut","anchor":"cleaning-a-specific-field-attribute","children":[]},{"title":"Rengöring och validering av fält som är beroende av varandra","anchor":"cleaning-and-validating-fields-that-depend-on-each-other","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API-referens","url":"/sv/6.1/ref/"},{"docname":"ref/forms/index","title":"Formulär","url":"/sv/6.1/ref/forms/"}],"prev":{"docname":"ref/forms/widgets","title":"Widgets","url":"/sv/6.1/ref/forms/widgets/"},"next":{"docname":"ref/logging","title":"Loggning","url":"/sv/6.1/ref/logging/"},"formats":{"html":"/sv/6.1/ref/forms/validation/","markdown":"/sv/6.1/ref/forms/validation.md","json":"/sv/6.1/ref/forms/validation.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/forms/validation.txt","official":"https://docs.djangoproject.com/sv/6.1/ref/forms/validation/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}