Formulärfält¶
När du skapar en Form
-klass är den viktigaste delen att definiera fälten i formuläret. Varje fält har en anpassad valideringslogik, tillsammans med några andra krokar.
Även om det primära sättet du kommer att använda Field
-klasser är i Form
-klasser, kan du också instansiera dem och använda dem direkt för att få en bättre uppfattning om hur de fungerar. Varje Field
-instans har en clean()
-metod, som tar ett enda argument och antingen ger upphov till ett django.core.exceptions.ValidationError
-undantag eller returnerar det rena värdet:
>>> from django import forms
>>> f = forms.EmailField()
>>> f.clean("foo@example.com")
'foo@example.com'
>>> f.clean("invalid email address")
Traceback (most recent call last):
...
ValidationError: ['Enter a valid email address.']
Argument för kärnområdet¶
Varje Field
-klass konstruktör tar minst dessa argument. Vissa Field
-klasser tar ytterligare fältspecifika argument, men följande bör alltid accepteras:
krävs
¶
- Field.required¶
Som standard antar varje Field
-klass att värdet är obligatoriskt, så om du skickar ett tomt värde - antingen None
eller den tomma strängen (""
) - kommer clean()
att ge upphov till ett ValidationError
undantag:
>>> from django import forms
>>> f = forms.CharField()
>>> f.clean("foo")
'foo'
>>> f.clean("")
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(None)
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'
För att ange att ett fält inte är obligatoriskt, skicka required=False
till konstruktören Field
:
>>> f = forms.CharField(required=False)
>>> f.clean("foo")
'foo'
>>> f.clean("")
''
>>> f.clean(None)
''
>>> f.clean(0)
'0'
>>> f.clean(True)
'True'
>>> f.clean(False)
'False'
Om en Field
har required=False
och du ger clean()
ett tomt värde, så kommer clean()`
att returnera ett normaliserat tomt värde istället för att ge upphov till ValidationError
. För CharField
kommer detta att returnera empty_value
som standard är en tom sträng. För andra klasser av Field
kan det vara None
. (Detta varierar från fält till fält.)
Widgets för obligatoriska formulärfält har HTML-attributet required
. Ställ in attributet Form.use_required_attribute
till False
för att inaktivera det. Attributet required
ingår inte i formulär för formuläruppsättningar eftersom webbläsarens validering kanske inte är korrekt när formuläruppsättningar läggs till och tas bort.
etikett
¶
- Field.label¶
Med argumentet label
kan du ange den ”människovänliga” etiketten för detta fält. Detta används när Field
visas i en Form
.
Som förklaras i Utmatning av formulär som HTML, genereras standardetiketten för ett Field
från fältnamnet genom att konvertera alla understreck till mellanslag och versera första bokstaven. Ange label
om detta standardbeteende inte resulterar i en lämplig etikett.
Här är ett fullständigt exempel på Form
som implementerar label
för två av sina fält. Vi har angett auto_id=False
för att förenkla utdata:
>>> from django import forms
>>> class CommentForm(forms.Form):
... name = forms.CharField(label="Your name")
... url = forms.URLField(label="Your website", required=False)
... comment = forms.CharField()
...
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Your name:<input type="text" name="name" required></div>
<div>Your website:<input type="url" name="url"></div>
<div>Comment:<input type="text" name="comment" required></div>
etikett_suffix
¶
- Field.label_suffix¶
Med argumentet label_suffix
kan du åsidosätta formulärets label_suffix
för varje enskilt fält:
>>> class ContactForm(forms.Form):
... age = forms.IntegerField()
... nationality = forms.CharField()
... captcha_answer = forms.IntegerField(label="2 + 2", label_suffix=" =")
...
>>> f = ContactForm(label_suffix="?")
>>> print(f)
<div><label for="id_age">Age?</label><input type="number" name="age" required id="id_age"></div>
<div><label for="id_nationality">Nationality?</label><input type="text" name="nationality" required id="id_nationality"></div>
<div><label for="id_captcha_answer">2 + 2 =</label><input type="number" name="captcha_answer" required id="id_captcha_answer"></div>
initial
¶
- Field.initial¶
Med argumentet initial
kan du ange det initiala värde som ska användas när detta Field
återges i ett obundet Form
.
För att ange dynamiska initialdata, se parametern Form.initial
.
Användningsfallet för detta är när du vill visa ett ”tomt” formulär där ett fält är initialiserat till ett visst värde. Ett exempel:
>>> from django import forms
>>> class CommentForm(forms.Form):
... name = forms.CharField(initial="Your name")
... url = forms.URLField(initial="https://")
... comment = forms.CharField()
...
>>> f = CommentForm(auto_id=False)
>>> print(f)
<div>Name:<input type="text" name="name" value="Your name" required></div>
<div>Url:<input type="url" name="url" value="https://" required></div>
<div>Comment:<input type="text" name="comment" required></div>
Du kanske tänker, varför inte bara skicka en ordbok med de ursprungliga värdena som data när du visar formuläret? Tja, om du gör det kommer du att utlösa validering och HTML-utdata kommer att innehålla eventuella valideringsfel:
>>> class CommentForm(forms.Form):
... name = forms.CharField()
... url = forms.URLField()
... comment = forms.CharField()
...
>>> default_data = {"name": "Your name", "url": "https://"}
>>> f = CommentForm(default_data, auto_id=False)
>>> print(f)
<div>Name:
<input type="text" name="name" value="Your name" required>
</div>
<div>Url:
<ul class="errorlist"><li>Enter a valid URL.</li></ul>
<input type="url" name="url" value="https://" required aria-invalid="true">
</div>
<div>Comment:
<ul class="errorlist"><li>This field is required.</li></ul>
<input type="text" name="comment" required aria-invalid="true">
</div>
Det är därför som ”initial”-värden bara visas för obundna formulär. För bundna formulär kommer HTML-utdata att använda de bundna uppgifterna.
Observera också att ”initiala” värden inte används som ”fallback”-data vid validering om värdet för ett visst fält inte anges. initial
-värden är endast avsedda för initial visning av formuläret:
>>> class CommentForm(forms.Form):
... name = forms.CharField(initial="Your name")
... url = forms.URLField(initial="https://")
... comment = forms.CharField()
...
>>> data = {"name": "", "url": "", "comment": "Foo"}
>>> f = CommentForm(data)
>>> f.is_valid()
False
# The form does *not* fallback to using the initial values.
>>> f.errors
{'url': ['This field is required.'], 'name': ['This field is required.']}
I stället för en konstant kan du också skicka en valfri callable:
>>> import datetime
>>> class DateForm(forms.Form):
... day = forms.DateField(initial=datetime.date.today)
...
>>> print(DateForm())
<div><label for="id_day">Day:</label><input type="text" name="day" value="2023-02-11" required id="id_day"></div>
Callable kommer att utvärderas först när det obundna formuläret visas, inte när det definieras.
widget
¶
- Field.widget¶
Med argumentet widget
kan du ange en Widget
-klass som ska användas vid rendering av detta Field
. Se Widgets för mer information.
hjälp_text
¶
- Field.help_text¶
Med argumentet help_text
kan du ange en beskrivande text för detta Field
. Om du anger help_text
kommer den att visas bredvid Field
när Field
återges med en av de praktiska Form
-metoderna (t.ex. as_ul()
).
Precis som modellfältets help_text
, är detta värde inte HTML-escaped i automatiskt genererade formulär.
Här är ett fullständigt exempel på en Form
som implementerar help_text
för två av sina fält. Vi har angett auto_id=False
för att förenkla utdata:
>>> from django import forms
>>> class HelpTextContactForm(forms.Form):
... subject = forms.CharField(max_length=100, help_text="100 characters max.")
... message = forms.CharField()
... sender = forms.EmailField(help_text="A valid email address, please.")
... cc_myself = forms.BooleanField(required=False)
...
>>> f = HelpTextContactForm(auto_id=False)
>>> print(f)
<div>Subject:<div class="helptext">100 characters max.</div><input type="text" name="subject" maxlength="100" required></div>
<div>Message:<input type="text" name="message" required></div>
<div>Sender:<div class="helptext">A valid email address, please.</div><input type="email" name="sender" required></div>
<div>Cc myself:<input type="checkbox" name="cc_myself"></div>
När ett fält har en hjälptext associeras den med dess inmatning med hjälp av HTML-attributet aria-describedby
. Om widgeten återges i en <fieldset>
läggs aria-describedby
till i detta element, annars läggs det till i widgetens <input>
:
>>> from django import forms
>>> class UserForm(forms.Form):
... username = forms.CharField(max_length=255, help_text="e.g., user@example.com")
...
>>> f = UserForm()
>>> print(f)
<div>
<label for="id_username">Username:</label>
<div class="helptext" id="id_username_helptext">e.g., user@example.com</div>
<input type="text" name="username" maxlength="255" required aria-describedby="id_username_helptext" id="id_username">
</div>
När du lägger till ett anpassat aria-describedby
-attribut, se till att även inkludera id
för help_text
-elementet (om det används) i önskad ordning. För användare av skärmläsare kommer beskrivningarna att läsas i den ordning de förekommer i aria-describedby
:
>>> class UserForm(forms.Form):
... username = forms.CharField(
... max_length=255,
... help_text="e.g., user@example.com",
... widget=forms.TextInput(
... attrs={"aria-describedby": "custom-description id_username_helptext"},
... ),
... )
...
>>> f = UserForm()
>>> print(f["username"])
<input type="text" name="username" aria-describedby="custom-description id_username_helptext" maxlength="255" id="id_username" required>
aria-describedby
support was added for <fieldset>
.
Felmeddelanden
¶
- Field.error_messages¶
Med argumentet error_messages
kan du åsidosätta de standardmeddelanden som fältet kommer att ge upphov till. Skicka in en ordbok med nycklar som matchar de felmeddelanden som du vill åsidosätta. Här är t.ex. standardfelmeddelandet:
>>> from django import forms
>>> generic = forms.CharField()
>>> generic.clean("")
Traceback (most recent call last):
...
ValidationError: ['This field is required.']
Och här är ett anpassat felmeddelande:
>>> name = forms.CharField(error_messages={"required": "Please enter your name"})
>>> name.clean("")
Traceback (most recent call last):
...
ValidationError: ['Please enter your name']
I avsnittet inbyggda fältklasser nedan definierar varje fält
de felmeddelandenycklar som används.
validerare
¶
- Field.validators¶
Med argumentet validators
kan du ange en lista över valideringsfunktioner för detta fält.
Se validators dokumentation för mer information.
lokalisera
¶
- Field.localize¶
Argumentet localize
gör det möjligt att lokalisera inmatning av formulärdata samt den renderade utdata.
Se format localization documentation för mer information.
inaktiverad
¶
- Field.disabled¶
Det booleska argumentet disabled
, när det sätts till True
, inaktiverar ett formulärfält som använder HTML-attributet disabled
så att det inte kan redigeras av användarna. Även om en användare manipulerar fältets värde som skickas till servern, kommer det att ignoreras till förmån för värdet från formulärets ursprungliga data.
template_name
¶
- Field.template_name¶
Argumentet template_name
tillåter en anpassad mall som ska användas när fältet återges med as_field_group()
. Som standard är detta värde inställt på "django/forms/field.html"
. Kan ändras per fält genom att åsidosätta detta attribut eller mer allmänt genom att åsidosätta standardmallen, se även Åsidosätta inbyggda fältmallar.
bound_field_class
¶
- Field.bound_field_class¶
Attributet bound_field_class
gör det möjligt att för varje fält åsidosätta Form.bound_field_class
.
Kontroll av om fältdata har ändrats¶
has_changed()
¶
Metoden has_changed()
används för att avgöra om fältvärdet har ändrats från det ursprungliga värdet. Returnerar True
eller False
.
Se Form.has_changed()
-dokumentationen för mer information.
Inbyggda Field
-klasser¶
Biblioteket forms
levereras naturligtvis med en uppsättning Field
-klasser som representerar vanliga valideringsbehov. Detta avsnitt dokumenterar varje inbyggt fält.
För varje fält beskriver vi den standardwidget som används om du inte anger widget
. Vi anger också det värde som returneras när du anger ett tomt värde (se avsnittet om required
ovan för att förstå vad det betyder).
BooleanField
¶
- class BooleanField(**kwargs)[source]¶
Standardwidget:
CheckboxInput
Tomt värde:
False
Normaliseras till: Ett Python-värde av typen
True
ellerFalse
.Validerar att värdet är
True
(t.ex. att kryssrutan är markerad) om fältet harrequired=True
.Felmeddelande nycklar:
krävs
Observera
Eftersom alla underklasser till
Field
harrequired=True
som standard, är valideringsvillkoret här viktigt. Om du vill inkludera en boolean i ditt formulär som kan vara antingenTrue
ellerFalse
(t.ex. en markerad eller avmarkerad kryssruta), måste du komma ihåg att skicka inrequired=False
när du skaparBooleanField
.
CharField
¶
- class CharField(**kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: En sträng.
Använder
MaxLengthValidator
ochMinLengthValidator
ommax_length
ochmin_length
anges. Annars är alla inmatningar giltiga.Nycklar för felmeddelande:
required
,max_length
,min_length
Har följande valfria argument för validering:
- max_length¶
- min_length¶
Om dessa argument anges säkerställer de att strängen är högst eller minst den angivna längden.
- strip¶
Om
True
(standard), kommer värdet att rensas från inledande och efterföljande blanksteg.
- empty_value¶
Det värde som ska användas för att representera ”tom”. Standardvärdet är en tom sträng.
ValField
¶
- class ChoiceField(**kwargs)[source]¶
Standardwidget:
Select
Tomt värde:
''
(en tom sträng)Normaliseras till: En sträng.
Validerar att det angivna värdet finns i listan med valmöjligheter.
Nycklar för felmeddelanden:
krävs
,ogiltigt_val
Felmeddelandet
invalid_choice
kan innehålla%(value)s
, som kommer att ersättas med det valda alternativet.Kräver ett extra argument:
- choices[source]¶
Antingen en iterabel av 2-tuples att använda som val för detta fält, :ref:
enumerationstyp <field-choices-enum-types>`, eller en callable som returnerar en sådan iterabel. Detta argument accepterar samma format som argumentet ``choices
till ett modellfält. Se modellfältets referensdokumentation om choices för mer information. Om argumentet är en callable utvärderas det varje gång fältets form initieras, förutom under rendering. Standardvärdet är en tom lista.
Typ av val
Det här fältet normaliserar val till strängar, så om val krävs i andra datatyper, t.ex. heltal eller booleaner, bör du överväga att använda
TypedChoiceField
i stället.
DateField
¶
- class DateField(**kwargs)[source]¶
Standardwidget:
DateInput
Tomt värde:
None
Normaliseras till: Ett Python-objekt av typen
datetime.date
.Validerar att det angivna värdet är antingen ett
datetime.date
,datetime.datetime
eller en sträng formaterad i ett visst datumformat.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Tar emot ett valfritt argument:
- input_formats¶
En iterabel av format som används för att försöka konvertera en sträng till ett giltigt
datetime.date
-objekt.
Om inget
input_formats
-argument anges hämtas standardinmatningsformaten från det aktiva lokala formatetDATE_INPUT_FORMATS
, eller frånDATE_INPUT_FORMATS
om lokalisering är inaktiverad. Se även format localization.
DatumTimeField
¶
- class DateTimeField(**kwargs)[source]¶
Standardwidget:
DateTimeInput
Tomt värde:
None
Normaliseras till: Ett Python-objekt av typen
datetime.datetime
.Validerar att det angivna värdet är antingen en
datetime.datetime
,datetime.date
eller en sträng formaterad i ett visst datetime-format.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Tar emot ett valfritt argument:
- input_formats¶
En iterabel av format som används för att försöka konvertera en sträng till ett giltigt
datetime.datetime
-objekt, utöver ISO 8601-format.
Fältet accepterar alltid strängar i ISO 8601-formaterade datum eller liknande som känns igen av
parse_datetime()
. Några exempel är:'2006-10-25 14:30:59'
'2006-10-25T14:30:59'
'2006-10-25 14:30'
'2006-10-25T14:30'
'2006-10-25T14:30Z'
'2006-10-25T14:30+02:00'
'2006-10-25'
Om inget
input_formats
-argument anges hämtas standardinmatningsformaten från det aktiva lokala formatetDATETIME_INPUT_FORMATS
ochDATE_INPUT_FORMATS
-nycklar, eller frånDATETIME_INPUT_FORMATS
ochDATE_INPUT_FORMATS
om lokalisering är inaktiverad. Se även format localization.
DecimalField
¶
- class DecimalField(**kwargs)[source]¶
Standardwidget:
NumberInput
närField.localize
ärFalse
, annarsTextInput
.Tomt värde:
None
Normaliseras till: En Python
decimal
.Validerar att det angivna värdet är en decimal. Använder
MaxValueValidator
ochMinValueValidator
ommax_value
ochmin_value
anges. AnvänderStepValueValidator
omstep_size
anges. Ledande och efterföljande blanksteg ignoreras.Nycklar för felmeddelanden:
required
,invalid
,max_value
,min_value
,max_digits
,max_decimal_places
,max_whole_digits
,step_size
.
Felmeddelandena
max_value
ochmin_value
kan innehålla%(limit_value)s
, som kommer att ersättas med lämplig gräns. På samma sätt kan felmeddelandenamax_digits
,max_decimal_places
ochmax_whole_digits
innehålla%(max)s
.Tar emot fem valfria argument:
- max_value¶
- min_value¶
Dessa styr det intervall av värden som tillåts i fältet och bör anges som
decimal.decimal
-värden.
- max_digits¶
Det maximala antalet siffror (de före decimaltecknet plus de efter decimaltecknet, med inledande nollor borttagna) som tillåts i värdet.
- decimal_places¶
Det maximala antalet decimaler som tillåts.
- step_size¶
Begränsa giltiga indata till en integrerad multipel av
step_size
. Ommin_value
också anges läggs det till som en förskjutning för att avgöra om stegstorleken matchar.
DurationField
¶
- class DurationField(**kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde:
None
Normaliseras till: En Python :klass:`~python:datetime.timedelta`.
Validerar att det angivna värdet är en sträng som kan konverteras till en
timedelta
. Värdet måste ligga mellandatetime.timedelta.min
ochdatetime.timedelta.max
.Nycklar för felmeddelanden:
krävs
,ogiltigt
,överflöde
.
Accepterar alla format som förstås av
parse_duration()
.
EmailField
¶
- class EmailField(**kwargs)[source]¶
Standardwidget:
EmailInput
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: En sträng.
Använder
EmailValidator
för att validera att det angivna värdet är en giltig e-postadress, med hjälp av ett måttligt komplext reguljärt uttryck.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Har de valfria argumenten
max_length
,min_length
ochempty_value
som fungerar precis som de gör förCharField
. Argumentetmax_length
är som standard 320 (se RFC 3696 Section 3).
FileField
¶
- class FileField(**kwargs)[source]¶
Standardwidget:
ClearableFileInput
Tomt värde:
None
Normaliseras till: Ett
UploadedFile
-objekt som sammanfattar filinnehållet och filnamnet i ett enda objekt.Kan validera att icke-tom filinformation har bundits till formuläret.
Nycklar för felmeddelanden:
krävs
,ogiltigt
, `` saknas``,tomt
,max_längd
Har de valfria argumenten för validering:
max_length
ochallow_empty_file
. Om de anges säkerställer de att filnamnet har högst den angivna längden och att valideringen lyckas även om filinnehållet är tomt.Mer information om objektet
UploadedFile
finns i dokumentation om filuppladdningar.När du använder en
FileField
i ett formulär måste du också komma ihåg att :ref:``binda filinformationen till formuläret <binding-uploaded-files>`.Felet
max_length
hänvisar till filnamnets längd. I felmeddelandet för den nyckeln kommer%(max)d
att ersättas med den maximala filnamnslängden och%(length)d
kommer att ersättas med den aktuella filnamnslängden.
FilePathField
¶
- class FilePathField(**kwargs)[source]¶
Standardwidget:
Select
Tomt värde:
''
(en tom sträng)Normaliseras till: En sträng.
Kontrollerar att det valda alternativet finns i listan med alternativ.
Nycklar för felmeddelanden:
krävs
,ogiltigt_val
Fältet gör det möjligt att välja bland filer i en viss katalog. Det tar fem extra argument; endast
path
är obligatoriskt:- path¶
Den absoluta sökvägen till den katalog vars innehåll du vill lista. Denna katalog måste existera.
- recursive¶
Om
False
(standard) kommer endast det direkta innehållet ipath
att erbjudas som val. OmTrue
, kommer katalogen att vara rekursivt nedåtgående och alla nedåtgående kommer att listas som val.
- match¶
Ett mönster för ett reguljärt uttryck; endast filer med namn som matchar detta uttryck kommer att tillåtas som val.
- allow_files¶
Valfritt. Antingen
True
ellerFalse
. Standard ärTrue
. Anger om filer på den angivna platsen ska inkluderas. Antingen detta ellerallow_folders
måste varaTrue
.
- allow_folders¶
Valfritt. Antingen
True
ellerFalse
. Standard ärFalse
. Anger om mappar på den angivna platsen ska inkluderas. Antingen detta ellerallow_files
måste varaTrue
.
FloatField
¶
- class FloatField(**kwargs)[source]¶
Standardwidget:
NumberInput
närField.localize
ärFalse
, annarsTextInput
.Tomt värde:
None
Normaliseras till: En Python-flottör.
Validerar att det angivna värdet är en float. Använder
MaxValueValidator
ochMinValueValidator
ommax_value
ochmin_value
anges. AnvänderStepValueValidator
omstep_size
anges. Ledande och efterföljande blanktecken är tillåtna, som i Pythons funktionfloat()
.Nycklar för felmeddelanden:
required
,invalid
,max_value
,min_value
,step_size
.
Tar emot tre valfria argument:
- max_value¶
- min_value¶
Dessa styr det värdeintervall som tillåts i fältet.
- step_size¶
Begränsa giltiga indata till en integrerad multipel av
step_size
. Ommin_value
också anges läggs det till som en förskjutning för att avgöra om stegstorleken matchar.
GenericIPAddressField
¶
- class GenericIPAddressField(**kwargs)[source]¶
Ett fält som innehåller antingen en IPv4- eller en IPv6-adress.
Standardwidget:
TextInput
Tomt värde:
''
(en tom sträng)Normaliseras till: En sträng. IPv6-adresser normaliseras enligt beskrivningen nedan.
Kontrollerar att det angivna värdet är en giltig IP-adress.
Nycklar för felmeddelanden:
required
,invalid
,max_length
Normaliseringen av IPv6-adresser följer RFC 4291 Section 2.2 avsnitt 2.2, inklusive användning av det IPv4-format som föreslås i punkt 3 i det avsnittet, som
::ffff:192.0.2.0
. Till exempel: skulle2001:0::0:01
normaliseras till2001::1
, och::ffff:0a0a:0a0a
till::ffff:10.10.10.10
. Alla tecken konverteras till gemener.Tar emot tre valfria argument:
- protocol¶
Begränsar giltiga indata till det angivna protokollet. Accepterade värden är
both
(standard),IPv4
ellerIPv6
. Matchningen är okänslig för skiftlägesanalys.
- unpack_ipv4¶
Packar upp IPv4-mappade adresser som
::ffff:192.0.2.1
. Om detta alternativ är aktiverat kommer den adressen att packas upp till192.0.2.1
. Standard är inaktiverat. Kan endast användas närprotocol
är inställt på'both'
.
Changed in Django 4.2.18:Standardvärdet för
max_length
var satt till 39 tecken.
ImageField
¶
- class ImageField(**kwargs)[source]¶
Standardwidget:
ClearableFileInput
Tomt värde:
None
Normaliseras till: Ett
UploadedFile
-objekt som sammanfattar filinnehållet och filnamnet i ett enda objekt.Validerar att fildata har bundits till formuläret. Använder även
FileExtensionValidator
för att validera att filändelsen stöds av Pillow.Nycklar för felmeddelanden:
krävs
,ogiltig
, `` saknas``,tomt
,ogiltig_bild
För att använda en
ImageField
krävs att pillow är installerat med stöd för de bildformat du använder. Om du stöter på ettcorrupt image
-fel när du laddar upp en bild, betyder det vanligtvis att Pillow inte förstår dess format. För att åtgärda detta installerar du lämpligt bibliotek och installerar om Pillow.När du använder en
ImageField
på ett formulär måste du också komma ihåg att :ref:``binda filinformationen till formuläret <binding-uploaded-files>`.Efter att fältet har rensats och validerats kommer objektet
UploadedFile
att ha ett ytterligareimage
-attribut som innehåller Pillow Image-instansen som används för att kontrollera om filen var en giltig bild. Pillow stänger den underliggande filbeskrivaren efter att ha verifierat en bild, så medan attribut för icke-bilddata, t.ex.format
,höjd
ochbredd
, är tillgängliga, kan metoder som får åtkomst till underliggande bilddata, t.ex.getdata()
ellergetpixel()
, inte användas utan att öppna filen igen. Ett exempel:>>> from PIL import Image >>> from django import forms >>> from django.core.files.uploadedfile import SimpleUploadedFile >>> class ImageForm(forms.Form): ... img = forms.ImageField() ... >>> file_data = {"img": SimpleUploadedFile("test.png", b"file data")} >>> form = ImageForm({}, file_data) # Pillow closes the underlying file descriptor. >>> form.is_valid() True >>> image_field = form.cleaned_data["img"] >>> image_field.image <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=191x287 at 0x7F5985045C18> >>> image_field.image.width 191 >>> image_field.image.height 287 >>> image_field.image.format 'PNG' >>> image_field.image.getdata() # Raises AttributeError: 'NoneType' object has no attribute 'seek'. >>> image = Image.open(image_field) >>> image.getdata() <ImagingCore object at 0x7f5984f874b0>
Dessutom kommer
UploadedFile.content_type
att uppdateras med bildens innehållstyp om Pillow kan bestämma den, annars kommer den att sättas tillNone
.
IntegerField
¶
- class IntegerField(**kwargs)[source]¶
Standardwidget:
NumberInput
närField.localize
ärFalse
, annarsTextInput
.Tomt värde:
None
Normaliseras till: Ett heltal i Python.
Validerar att det givna värdet är ett heltal. Använder
MaxValueValidator
ochMinValueValidator
ommax_value
ochmin_value
anges. AnvänderStepValueValidator
omstep_size
anges. Ledande och efterföljande blanktecken är tillåtna, som i Pythons funktionint()
.Nycklar för felmeddelanden:
required
,invalid
,max_value
,min_value
,step_size
Felmeddelandena
max_value
,min_value
ochstep_size
kan innehålla%(limit_value)s
, som ersätts med lämplig gräns.Tar emot tre valfria argument för validering:
- max_value¶
- min_value¶
Dessa styr det värdeintervall som tillåts i fältet.
- step_size¶
Begränsa giltiga indata till en integrerad multipel av
step_size
. Ommin_value
också anges läggs det till som en förskjutning för att avgöra om stegstorleken matchar.
JSONField
¶
- class JSONField(encoder=None, decoder=None, **kwargs)[source]¶
Ett fält som tar emot JSON-kodade data för en
JSONField
.Standardwidget:
Textarea
Tomt värde:
None
Normaliseras till: En Python-representation av JSON-värdet (vanligtvis som en
dict
,list
ellerNone
), beroende påJSONField.decoder
.Validerar att det angivna värdet är en giltig JSON.
Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Tar två valfria argument:
- encoder¶
En
json.JSONEncoder
-underklass för att serialisera datatyper som inte stöds av standard JSON serializer (t.ex.datetime.datetime
ellerUUID
). Du kan till exempel använda klassenDjangoJSONEncoder
.Standardvärdet är
json.JSONEncoder
.
- decoder¶
En
json.JSONDecoder
-underklass för att deserialisera indata. Din deserialisering kan behöva ta hänsyn till det faktum att du inte kan vara säker på indatatypen. Till exempel: riskerar du att returnera endatetime
som faktiskt var en sträng som bara råkade vara i samma format som valts fördatetime
.Dekodaren
kan användas för att validera indata. Omjson.JSONDecodeError
uppstår under deserialiseringen, kommer ettValidationError
att uppstå.Standardvärdet är
json.JSONDecoder
.
Observera
Om du använder en
ModelForm
, kommerencoder
ochdecoder
frånJSONField`
att användas.Användarvänliga formulär
JSONField
är inte särskilt användarvänligt i de flesta fall. Det är dock ett användbart sätt att formatera data från en widget på klientsidan för inlämning till servern.
MultipleChoiceField
¶
- class MultipleChoiceField(**kwargs)[source]¶
Standardwidget:
SelectMultiple
Tomt värde:
[]
(en tom lista)Normaliserar till: En lista med strängar.
Validerar att alla värden i den angivna listan med värden finns i listan med val.
Nycklar för felmeddelanden:
required
,invalid_choice
,invalid_list
Felmeddelandet
invalid_choice
kan innehålla%(value)s
, som kommer att ersättas med det valda alternativet.Tar ett extra obligatoriskt argument,
choices
, som förChoiceField
.
NullBooleanField
¶
- class NullBooleanField(**kwargs)[source]¶
Standardwidget:
NullBooleanSelect
Tomt värde:
None
Normaliseras till: Ett Python-värde av typen
True
,False
ellerNone
.Validerar ingenting (d.v.s. det ger aldrig upphov till ett
ValidationError
).
NullBooleanField
kan användas med widgetar somSelect
ellerRadioSelect
genom att tillhandahålla widgetenchoices
:NullBooleanField( widget=Select( choices=[ ("", "Unknown"), (True, "Yes"), (False, "No"), ] ) )
RegexField
¶
- class RegexField(**kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: En sträng.
Använder
RegexValidator
för att validera att det angivna värdet matchar ett visst reguljärt uttryck.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Kräver ett argument:
- regex¶
Ett reguljärt uttryck som anges antingen som en sträng eller som ett kompilerat objekt för reguljära uttryck.
Tar också
max_length
,min_length
,strip
ochempty_value
som fungerar precis som de gör förCharField
.- strip¶
Standardvärdet är
False
. Om aktiverat kommer stripping att tillämpas före regex-valideringen.
SlugField
¶
- class SlugField(**kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: En sträng.
Använder
validate_slug
ellervalidate_unicode_slug
för att validera att det angivna värdet endast innehåller bokstäver, siffror, understreck och bindestreck.Felmeddelanden:
krävs
,ogiltigt
Detta fält är avsett att användas för att representera en modell
SlugField
i formulär.Tar emot två valfria parametrar:
- allow_unicode¶
En boolean som instruerar fältet att acceptera Unicode-bokstäver utöver ASCII-bokstäver. Standardvärdet är
False
.
- empty_value¶
Det värde som ska användas för att representera ”tom”. Standardvärdet är en tom sträng.
TimeField
¶
- class TimeField(**kwargs)[source]¶
Standardwidget:
TimeInput
Tomt värde:
None
Normaliseras till: Ett Python-objekt av typen
datetime.time
.Validerar att det angivna värdet är antingen en
datetime.time
eller en sträng formaterad i ett visst tidsformat.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Tar emot ett valfritt argument:
- input_formats¶
En iterabel av format som används för att försöka konvertera en sträng till ett giltigt
datetime.time
-objekt.
Om inget
input_formats
-argument anges hämtas standardinmatningsformaten från det aktiva lokala formatetTIME_INPUT_FORMATS
, eller frånTIME_INPUT_FORMATS
om lokalisering är inaktiverad. Se även format localization.
TypedChoiceField
¶
- class TypedChoiceField(**kwargs)[source]¶
Precis som en
ChoiceField
, menTypedChoiceField
tar två extra argument,coerce
ochempty_value
.Standardwidget:
Select
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: Ett värde av den typ som anges av argumentet
coerce
.Validerar att det angivna värdet finns i listan med val och kan tvingas fram.
Nycklar för felmeddelanden:
krävs
,ogiltigt_val
Tar extra argument:
- coerce¶
En funktion som tar ett argument och returnerar ett tvingat värde. Exempel är de inbyggda typerna
int
,float
,bool
och andra typer. Standardvärdet är en identitetsfunktion. Observera att tvingande sker efter validering av indata, så det är möjligt att tvinga till ett värde som inte finns ichoices
.
- empty_value¶
Det värde som ska användas för att representera ”tom” Standardvärdet är den tomma strängen;
None
är ett annat vanligt val här. Observera att det här värdet inte kommer att tvingas fram av den funktion som anges i argumentetcoerce
, så välj det i enlighet med detta.
Typ av flervalsfält
¶
- class TypedMultipleChoiceField(**kwargs)[source]¶
Precis som en
MultipleChoiceField
, förutom attTypedMultipleChoiceField
tar två extra argument,coerce
ochempty_value
.Standardwidget:
SelectMultiple
Tomt värde: Vad du än har angett som
empty_value
Normaliseras till: En lista med värden av den typ som anges i argumentet
coerce
.Validerar att de angivna värdena finns i listan med val och kan tvingas.
Nycklar för felmeddelanden:
krävs
,ogiltigt_val
Felmeddelandet
invalid_choice
kan innehålla%(value)s
, som kommer att ersättas med det valda alternativet.Tar två extra argument,
coerce
ochempty_value
, som förTypedChoiceField
.
URL-fält
¶
- class URLField(**kwargs)[source]¶
Standardwidget:
URLInput
Tomt värde: Vad du än har angett som
empty_value
.Normaliseras till: En sträng.
Använder
URLValidator
för att validera att det angivna värdet är en giltig URL.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Har de valfria argumenten
max_length
,min_length
,empty_value
som fungerar precis som de gör förCharField
, och ytterligare ett argument:- assume_scheme¶
Det schema som antas för webbadresser som inte har något schema. Standardvärdet är
"http"
. Till exempel:, omassume_scheme
är"https"
och det angivna värdet är"example.com"
, kommer det normaliserade värdet att vara"https://example.com"
.
Deprecated since version 5.0: Standardvärdet för
assume_scheme
kommer att ändras från"http"
till"https"
i Django 6.0. Ställ inFORMS_URLFIELD_ASSUME_HTTPS
övergångsinställning tillTrue
för att välja att använda"https"
under Django 5.x utgivningscykel.
UUIDField
¶
Något komplexa inbyggda Field
-klasser¶
ComboField
¶
- class ComboField(**kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde:
''
(en tom sträng)Normaliseras till: En sträng.
Validerar det angivna värdet mot vart och ett av de fält som angetts som argument till
ComboField
.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt
Kräver ett extra argument:
- fields¶
Lista över fält som ska användas för att validera fältets värde (i den ordning de anges).
>>> from django.forms import ComboField >>> f = ComboField(fields=[CharField(max_length=20), EmailField()]) >>> f.clean("test@example.com") 'test@example.com' >>> f.clean("longemailaddress@example.com") Traceback (most recent call last): ... ValidationError: ['Ensure this value has at most 20 characters (it has 28).']
MultiValueField
¶
- class MultiValueField(fields=(), **kwargs)[source]¶
Standardwidget:
TextInput
Tomt värde:
''
(en tom sträng)Normaliserar till: den typ som returneras av
compress
-metoden i underklassen.Validerar det angivna värdet mot vart och ett av de fält som angetts som argument till
MultiValueField
.Nycklar för felmeddelanden: ”Obligatoriskt”, ”Ogiltigt”, ”Ofullständigt
Sammanställer logiken i flera fält som tillsammans ger ett enda värde.
Detta fält är abstrakt och måste underklassas. Till skillnad från envärdesfälten får underklasser av
MultiValueField
inte implementeraclean()
utan istället - implementeracompress()
.Kräver ett extra argument:
- fields¶
En tupel av fält vars värden rensas och därefter kombineras till ett enda värde. Varje värde i fältet rensas av motsvarande fält i
fields
– det första värdet rensas av det första fältet, det andra värdet rensas av det andra fältet, osv. När alla fält har rensats kombineras listan över rensade värden till ett enda värde medcompress()
.
Tar också några valfria argument:
- require_all_fields¶
Standardvärdet är
True
, i vilket fall ettrequired
valideringsfel kommer att uppstå om inget värde anges för något fält.När attributet
Field.required
är satt tillFalse
kan det sättas tillFalse
för enskilda fält för att göra dem valfria. Om inget värde anges för ett obligatoriskt fält kommer valideringsfeletincomplete
att uppstå.Ett standardfelmeddelande
incomplete
kan definieras för underklassenMultiValueField
, eller så kan olika meddelanden definieras för varje enskilt fält. Till exempel:from django.core.validators import RegexValidator class PhoneField(MultiValueField): def __init__(self, **kwargs): # Define one message for all fields. error_messages = { "incomplete": "Enter a country calling code and a phone number.", } # Or define a different message for each field. fields = ( CharField( error_messages={"incomplete": "Enter a country calling code."}, validators=[ RegexValidator(r"^[0-9]+$", "Enter a valid country calling code."), ], ), CharField( error_messages={"incomplete": "Enter a phone number."}, validators=[RegexValidator(r"^[0-9]+$", "Enter a valid phone number.")], ), CharField( validators=[RegexValidator(r"^[0-9]+$", "Enter a valid extension.")], required=False, ), ) super().__init__( error_messages=error_messages, fields=fields, require_all_fields=False, **kwargs )
- widget¶
Måste vara en underklass till
django.forms.MultiWidget
. Standardvärdet ärTextInput
, vilket förmodligen inte är särskilt användbart i det här fallet.
- compress(data_list)[source]¶
Tar en lista med giltiga värden och returnerar en ”komprimerad” version av dessa värden - i ett enda värde. Exempelvis är
SplitDateTimeField
en underklass som kombinerar ett tidsfält och ett datumfält till ettdatetime
-objekt.Denna metod måste implementeras i underklasserna.
SplitDateTimeField
¶
- class SplitDateTimeField(**kwargs)[source]¶
Standardwidget:
SplitDateTimeWidget
Tomt värde:
None
Normaliseras till: Ett Python-objekt av typen
datetime.datetime
.Validerar att det angivna värdet är en
datetime.datetime
eller en sträng formaterad i ett visst datetime-format.Nycklar för felmeddelanden:
required
,invalid
,invalid_date
,invalid_time
Tar två valfria argument:
- input_date_formats¶
En lista över format som används för att försöka konvertera en sträng till ett giltigt
datetime.date
-objekt.
Om inget
input_date_formats
-argument anges används standardformaten för inmatning förDateField
.- input_time_formats¶
En lista över format som används för att försöka konvertera en sträng till ett giltigt
datetime.time
-objekt.
Om inget
input_time_formats
-argument anges används standardformaten för inmatning förTimeField
.
Fält som hanterar relationer¶
Två fält finns tillgängliga för att representera relationer mellan modeller: ModelChoiceField
och ModelMultipleChoiceField
. Båda dessa fält kräver en enda parameter, queryset
, som används för att skapa valmöjligheterna för fältet. Vid validering av formuläret kommer dessa fält att placera antingen ett modellobjekt (i fallet ModelChoiceField
) eller flera modellobjekt (i fallet ModelMultipleChoiceField
) i formulärets cleaned_data
-ordbok.
För mer komplexa användningar kan du ange queryset=None
när du deklarerar formulärfältet och sedan fylla i queryset
i formulärets __init__()
-metod:
class FooMultipleChoiceForm(forms.Form):
foo_select = forms.ModelMultipleChoiceField(queryset=None)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["foo_select"].queryset = ...
Både ModelChoiceField
och ModelMultipleChoiceField
har ett iterator
attribut som specificerar den klass som används för att iterera över frågeuppsättningen när val genereras. Se Iteration av relationsval för detaljer.
ModellValField
¶
- class ModelChoiceField(**kwargs)[source]¶
Standardwidget:
Select
Tomt värde:
None
Normaliseras till: En modellinstans.
Validerar att det angivna id:et finns i frågeuppsättningen.
Nycklar för felmeddelanden:
krävs
,ogiltigt_val
Felmeddelandet
invalid_choice
kan innehålla%(value)s
, som kommer att ersättas med det valda alternativet.Gör det möjligt att välja ett enda modellobjekt, lämpligt för att representera en främmande nyckel. Observera att standardwidgeten för
ModelChoiceField
blir opraktisk när antalet poster ökar. Du bör undvika att använda den för mer än 100 poster.Ett enda argument krävs:
- queryset¶
En
QuerySet
av modellobjekt från vilka valmöjligheterna för fältet härleds och som används för att validera användarens val. Den utvärderas när formuläret renderas.
ModelChoiceField
tar också flera valfria argument:- empty_label¶
Som standard kommer widgeten
<select>
som används avModelChoiceField
att ha ett tomt val längst upp i listan. Du kan ändra texten på denna etikett (som är"---------"
som standard) med attributetempty_label
, eller du kan inaktivera den tomma etiketten helt genom att ställa inempty_label
tillNone
:# A custom empty label field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)") # No empty label field2 = forms.ModelChoiceField(queryset=..., empty_label=None)
Observera att inget tomt val skapas (oavsett värdet på
empty_label
) om enModelChoiceField
krävs och har ett standardinitialvärde, eller om enwidget
är inställd påRadioSelect
och argumentetblank
ärFalse
.
- to_field_name¶
Detta valfria argument används för att ange det fält som ska användas som värde för valen i fältets widget. Se till att det är ett unikt fält för modellen, annars kan det valda värdet matcha mer än ett objekt. Som standard är det inställt på
None
, i vilket fall primärnyckeln för varje objekt kommer att användas. Till exempel:# No custom to_field_name field1 = forms.ModelChoiceField(queryset=...)
skulle ge:
<select id="id_field1" name="field1"> <option value="obj1.pk">Object1</option> <option value="obj2.pk">Object2</option> ... </select>
och:
# to_field_name provided field2 = forms.ModelChoiceField(queryset=..., to_field_name="name")
skulle ge:
<select id="id_field2" name="field2"> <option value="obj1.name">Object1</option> <option value="obj2.name">Object2</option> ... </select>
- blank¶
När du använder widgeten
RadioSelect
, avgör detta valfria booleska argument om ett tomt val skapas. Som standard ärblank
False
, i vilket fall inget tomt val skapas.
ModelChoiceField
har också attributet:- iterator¶
Den iteratorklass som används för att generera fältval från
queryset
. Som standard användsModelChoiceIterator
.
Metoden
__str__()
i modellen kommer att anropas för att generera strängrepresentationer av objekten för användning i fältets val. För att tillhandahålla anpassade representationer, subklassaModelChoiceField
och åsidosättlabel_from_instance
. Denna metod tar emot ett modellobjekt och ska returnera en sträng som är lämplig för att representera det. Till exempel:from django.forms import ModelChoiceField class MyModelChoiceField(ModelChoiceField): def label_from_instance(self, obj): return "My Object #%i" % obj.id
ModellMultipleChoiceField
¶
- class ModelMultipleChoiceField(**kwargs)[source]¶
Standardwidget:
SelectMultiple
Tomt värde: En tom
QuerySet
(self.queryset.none()
)Normaliseras till: En
QuerySet
av modellinstanser.Validerar att varje id i den angivna listan med värden finns i queryset.
Nycklar för felmeddelanden:
required
,invalid_list
,invalid_choice
,invalid_pk_value
Meddelandet
invalid_choice
kan innehålla%(value)s
och meddelandetinvalid_pk_value
kan innehålla%(pk)s
, som kommer att ersättas med lämpliga värden.Tillåter val av ett eller flera modellobjekt, lämpligt för att representera en många-till-många-relation. Precis som med
ModelChoiceField
kan du användalabel_from_instance
för att anpassa objektrepresentationerna.Ett enda argument krävs:
- queryset¶
Samma som
ModelChoiceField.queryset
.
Tar emot ett valfritt argument:
- to_field_name¶
Samma som
ModelChoiceField.to_field_name
.
ModelMultipleChoiceField
har också attributet:- iterator¶
Samma som
ModelChoiceField.iterator
.
Iteration av relationsval¶
Som standard använder ModelChoiceField
och ModelMultipleChoiceField
ModelChoiceIterator
för att generera fältets choices
.
Vid iteration ger ModelChoiceIterator
2-tupelval som innehåller ModelChoiceIteratorValue
-instanser som det första value
-elementet i varje val. ModelChoiceIteratorValue
omsluter valvärdet samtidigt som det bibehåller en referens till källmodellinstansen som kan användas i anpassade widgetimplementeringar, till exempel för att lägga till data-* attribut till <option>
element.
Tänk till exempel på följande modeller:
from django.db import models
class Topping(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(decimal_places=2, max_digits=6)
def __str__(self):
return self.name
class Pizza(models.Model):
topping = models.ForeignKey(Topping, on_delete=models.CASCADE)
Du kan använda en Select
widgetunderklass för att inkludera värdet av Topping.price
som HTML-attributet data-price
för varje <option>
element:
from django import forms
class ToppingSelect(forms.Select):
def create_option(
self, name, value, label, selected, index, subindex=None, attrs=None
):
option = super().create_option(
name, value, label, selected, index, subindex, attrs
)
if value:
option["attrs"]["data-price"] = value.instance.price
return option
class PizzaForm(forms.ModelForm):
class Meta:
model = Pizza
fields = ["topping"]
widgets = {"topping": ToppingSelect}
Detta kommer att göra Pizza.topping
-valet som:
<select id="id_topping" name="topping" required>
<option value="" selected>---------</option>
<option value="1" data-price="1.50">mushrooms</option>
<option value="2" data-price="1.25">onions</option>
<option value="3" data-price="1.75">peppers</option>
<option value="4" data-price="2.00">pineapple</option>
</select>
För mer avancerad användning kan du subklassa ModelChoiceIterator
för att anpassa de 2-tupelval som erhålls.
ModelChoiceIterator
¶
- class ModelChoiceIterator(field)[source]¶
Standardklassen som tilldelas attributet
iterator
iModelChoiceField
ochModelMultipleChoiceField
. En iterator som ger 2-tupelval från frågeuppsättningen.Ett enda argument krävs:
- field¶
Instansen av
ModelChoiceField
ellerModelMultipleChoiceField
för att iterera och ge val.
ModelChoiceIterator
har följande metod:- __iter__()[source]¶
Ger 2-tupelval, i formatet
(value, label)
som används avChoiceField.choices
. Det förstavalue
-elementet är enModelChoiceIteratorValue
-instans.
ModelChoiceIteratorValue
¶
- class ModelChoiceIteratorValue(value, instance)[source]¶
Två argument krävs:
- value¶
Valets värde. Detta värde används för att återge attributet
value
i ett HTML-element<option>
.
- instance¶
Modellinstansen från queryset. Instansen kan nås i anpassade implementeringar av
ChoiceWidget.create_option()
för att justera den HTML som återges.
ModelChoiceIteratorValue
har följande metod:
Skapa anpassade fält¶
Om de inbyggda Field
-klasserna inte uppfyller dina behov kan du skapa egna Field
-klasser. För att göra detta skapar du en underklass av django.forms.Field
. Dess enda krav är att den implementerar en clean()
-metod och att dess __init__()
-metod accepterar de kärnargument som nämns ovan (required
, label
, initial
, widget
, help_text
).
Du kan också anpassa hur ett fält ska nås genom att åsidosätta bound_field_class
eller åsidosätta Field.get_bound_field()
om du behöver mer flexibilitet när du skapar BoundField
:
- Field.get_bound_field(form, field_name)[source]¶
Tar en instans av
Form
och namnet på fältet. Den returneradeBoundField
-instansen kommer att användas vid åtkomst till fältet i en mall.
Se Anpassa BoundField för exempel på åsidosättande av en BoundField
.