{"title":"Validering av formulär och fält","version":"6.0","locale":"sv","docname":"ref/forms/validation","url":"/sv/6.0/ref/forms/validation/","canonical":"https://djangodocs.dev/sv/6.0/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>Note that any errors raised by your <a class=\"reference internal\" href=\"/sv/6.0/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> override will not\nbe associated with any field in particular. They go into a special\n”field” (called <code class=\"docutils literal notranslate\">__all__</code>), which you can access via the\n<a class=\"reference internal\" href=\"/sv/6.0/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> method if you need to. If you\nwant to attach errors to a specific field in the form, you need to call\n<a class=\"reference internal\" href=\"/sv/6.0/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.0/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>These methods are run in the order given above, one field at a time. That is,\nfor each field in the form (in the order they are declared in the form\ndefinition), the <code class=\"docutils literal notranslate\">Field.clean()</code> method (or its override) is run, then\n<code class=\"docutils literal notranslate\">clean_&lt;fieldname&gt;()</code>. Finally, once those two methods are run for every\nfield, the <a class=\"reference internal\" href=\"/sv/6.0/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> method, or its override, is executed whether\nor not the previous methods have raised errors.</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>Tillhandahålla en beskrivande felkod till 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>_<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.0/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.0/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.0/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.0/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.0/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.0/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>Continuing on from the previous example, suppose that in our <code class=\"docutils literal notranslate\">ContactForm</code>,\nwe want to make sure that the <code class=\"docutils literal notranslate\">recipients</code> field only contains addresses that\nare <code class=\"docutils literal notranslate\">&#64;example.com</code>. This is validation that is specific to our form, so we\ndon’t want to put it into the general <code class=\"docutils literal notranslate\">MultiEmailField</code> class. Instead, we\nwrite a cleaning method that operates on the <code class=\"docutils literal notranslate\">recipients</code> field, like so:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"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>Suppose we add another requirement to our contact form: if the <code class=\"docutils literal notranslate\">urgent</code> field\nis <code class=\"docutils literal notranslate\">True</code>, the <code class=\"docutils literal notranslate\">subject</code> must contain <code class=\"docutils literal notranslate\">&quot;help&quot;</code>. We are performing\nvalidation on more than one field at a time, so the form’s <a class=\"reference internal\" href=\"/sv/6.0/ref/forms/api/#django.forms.Form.clean\" title=\"django.forms.Form.clean\"><code class=\"xref py py-meth docutils literal notranslate\">clean()</code></a>\nmethod is a good spot to do this. Notice that we are talking about the\n<code class=\"docutils literal notranslate\">clean()</code> method on the form here, whereas earlier we were writing a\n<code class=\"docutils literal notranslate\">clean()</code> method on a field. It’s important to keep the field and form\ndifference clear when working out where to validate things. Fields are single\ndata points, forms are a collection of fields.</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>The second approach for reporting validation errors might involve assigning the\nerror message to one of the fields. In this case, let’s assign an error message\nto both the ”subject” and ”urgent” rows in the form display. Be careful when\ndoing this in practice, since it can lead to confusing form output. We’re\nshowing what is possible here and leaving it up to you and your designers to\nwork out what works effectively in your particular situation. Our new code\n(replacing the previous sample) looks like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"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.0/ref/"},{"docname":"ref/forms/index","title":"Formulär","url":"/sv/6.0/ref/forms/"}],"prev":{"docname":"ref/forms/widgets","title":"Widgets","url":"/sv/6.0/ref/forms/widgets/"},"next":{"docname":"ref/logging","title":"Loggning","url":"/sv/6.0/ref/logging/"},"formats":{"html":"/sv/6.0/ref/forms/validation/","markdown":"/sv/6.0/ref/forms/validation.md","json":"/sv/6.0/ref/forms/validation.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/ref/forms/validation.txt","official":"https://docs.djangoproject.com/sv/6.0/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"]}