Djangoä¹form表å
ä¸ å ³äºform表åçä»ç»ï¼
æ们ä¹åå¨HTML页é¢ä¸å©ç¨form表ååå端æ交æ°æ®æ¶ï¼é½ä¼åä¸äºè·åç¨æ·è¾å ¥çæ ç¾å¹¶ä¸ç¨formæ ç¾æå®ä»¬å èµ·æ¥ã
ä¸æ¤åæ¶æ们å¨å¥½å¤åºæ¯ä¸é½éè¦å¯¹ç¨æ·çè¾å ¥åæ ¡éªï¼æ¯å¦æ ¡éªç¨æ·æ¯å¦è¾å ¥ï¼è¾å ¥çé¿åº¦åæ ¼å¼çæ£ä¸æ£ç¡®ãå¦æç¨æ·è¾å ¥çå 容æé误就éè¦å¨é¡µé¢ä¸ç¸åºçä½ç½®æ¾ç¤ºæ¾ç¤ºå¯¹åºçé误信æ¯.ã
Django formç»ä»¶å°±å®ç°äºä¸é¢æè¿°çåè½ã
æ»ç»ä¸ä¸ï¼å ¶å®formç»ä»¶ç主è¦åè½å¦ä¸:
1 HTML页é¢éè¦æ们æå¨åï¼form表ååªè½çæä¸äºè·åç¨æ·ä¿¡æ¯çinputæ ç¾ï¼æ¯å¦æ们éè¦èªå·±æå¨å formæ ç¾ä»¥åsubmitæ交æé®ã
2 对æ交çæ°æ®è¿è¡æ ¡éªè¿åé误信æ¯ï¼æ们å¯ä»¥å¨Djangoæ ¹ç®å½ä¸å»ºä¸ä¸ªmyformä¸é¨ç¨æ¥åæ¾æ们çform表çå 容ã
3 å¨é¡µé¢ä¿çç¨æ·å¡«åçä¿¡æ¯ï¼æ¯å¦æ们æ示ç¨æ·é误信æ¯çåæ¶ï¼ç¨æ·å¡«åçé误信æ¯å¹¶ä¸ä¼æ¶å¤±ã
äº å端åå端åé请æ±ççæ¹å¼é½æåªäºï¼
å端åå端åé请æ±çæ¹å¼ï¼ 1. ç´æ¥å¨æµè§å¨å°åæ è¾å ¥URLè®¿é® --> GET 2. ç¹å»aæ ç¾è·³è½¬å°æå®é¡µé¢ --> GET 3. form表å --> GET/POST 4. AJAX --> GET/POST
ä¸ ä¸¤ç§æ¹å¼å¯¹æ¯formç»ä»¶ä¸æ®éçinputç»å½ï¼
æ®éç注åï¼
def login(request): error_msg = "" if request.method == "POST": username = request.POST.get("username") pwd = request.POST.get("pwd") if username == "Q1mi" and pwd == "123456": return HttpResponse("OK") else: error_msg = "ç¨æ·åæå¯ç é误" return render(request, "login.html", {"error_msg": error_msg})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>login</title> <style> .error { color: red; } </style> </head> <body> <form action="/login/" method="post"> {% csrf_token %} <p> <label for="username">ç¨æ·å</label> <input type="text" name="username" id="username"> </p> <p> <label for="pwd">å¯ç </label> <input type="password" name="pwd" id="pwd"> <span class="error"></span> </p> <p> <input type="submit"> <span class="error">{{ error_msg }}</span> </p> </form> </body> </html>
formç»ä»¶çï¼
class LoginForm(forms.Form): username = forms.CharField(min_length=8, label="ç¨æ·å") pwd = forms.CharField(min_length=6, label="å¯ç ") def login2(request): error_msg = "" form_obj = LoginForm() if request.method == "POST": form_obj = LoginForm(request.POST) if form_obj.is_valid(): username = form_obj.cleaned_data.get("username") pwd = form_obj.cleaned_data.get("pwd") if username == "Q1mi" and pwd == "123456": return HttpResponse("OK") else: error_msg = "ç¨æ·åæå¯ç é误" return render(request, "login2.html", {"form_obj": form_obj, "error_msg": error_msg})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>login</title> <style> .error { color: red; } </style> </head> <body> <form action="/login2/" method="post" novalidate> {% csrf_token %} <p> {{ form_obj.username.label }} {{ form_obj.username }} <span class="error">{{ form_obj.username.errors.0 }}</span> </p> <p> {{ form_obj.pwd.label }} {{ form_obj.pwd }} <span class="error">{{ form_obj.pwd.errors.0 }}</span> </p> <p> <input type="submit"> <span class="error">{{ error_msg }}</span> </p> </form> </body> </html>
å form常ç¨çå段ä¸æ件ï¼
å建Formç±»æ¶ï¼ä¸»è¦æ¶åå° ãå段ã å ãæ件ãï¼å段ç¨äºå¯¹ç¨æ·è¯·æ±æ°æ®çéªè¯ï¼æ件ç¨äºèªå¨çæHTML;
initial
åå§å¼ï¼inputæ¡éé¢çåå§å¼ã
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="ç¨æ·å", initial="å¼ ä¸" # 设置é»è®¤å¼ ) pwd = forms.CharField(min_length=6, label="å¯ç ")
error_messages
éåé误信æ¯ã
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="ç¨æ·å", initial="å¼ ä¸", error_messages={ "required": "ä¸è½ä¸ºç©º", "invalid": "æ ¼å¼é误", "min_length": "ç¨æ·åæç8ä½" } ) pwd = forms.CharField(min_length=6, label="å¯ç ")
password
class LoginForm(forms.Form): ... pwd = forms.CharField( min_length=6, label="å¯ç ", widget=forms.widgets.PasswordInput(attrs={'class': 'c1'}, render_value=True) )
radioSelect
åradioå¼ä¸ºå符串
class LoginForm(forms.Form): username = forms.CharField( min_length=8, label="ç¨æ·å", initial="å¼ ä¸", error_messages={ "required": "ä¸è½ä¸ºç©º", "invalid": "æ ¼å¼é误", "min_length": "ç¨æ·åæç8ä½" } ) pwd = forms.CharField(min_length=6, label="å¯ç ") gender = forms.fields.ChoiceField( choices=((1, "ç·"), (2, "女"), (3, "ä¿å¯")), label="æ§å«", initial=3, widget=forms.widgets.RadioSelect )
åéSelect
class LoginForm(forms.Form): ... hobby = forms.fields.ChoiceField( choices=((1, "篮ç"), (2, "足ç"), (3, "åè²ç"), ), label="ç±å¥½", initial=3, widget=forms.widgets.Select )
å¤éSelect
class LoginForm(forms.Form): ... hobby = forms.fields.MultipleChoiceField( choices=((1, "篮ç"), (2, "足ç"), (3, "åè²ç"), ), label="ç±å¥½", initial=[1, 3], widget=forms.widgets.SelectMultiple )
åécheckbox
class LoginForm(forms.Form): ... keep = forms.fields.ChoiceField( label="æ¯å¦è®°ä½å¯ç ", initial="checked", widget=forms.widgets.CheckboxInput )
å¤écheckbox
class LoginForm(forms.Form): ... hobby = forms.fields.MultipleChoiceField( choices=((1, "篮ç"), (2, "足ç"), (3, "åè²ç"),), label="ç±å¥½", initial=[1, 3], widget=forms.widgets.CheckboxSelectMultiple )
äº å ³äºchoiceçä¸äºæ³¨æäºé¡¹ï¼
å¨ä½¿ç¨éæ©æ ç¾æ¶ï¼éè¦æ³¨æchoicesçé项å¯ä»¥ä»æ°æ®åºä¸è·åï¼ä½æ¯ç±äºæ¯éæå段 è·åçå¼æ æ³å®æ¶æ´æ°ï¼é£ä¹éè¦èªå®ä¹æé æ¹æ³ä»èè¾¾å°æ¤ç®çã
æ¹å¼ä¸ï¼
from django.forms import Form from django.forms import widgets from django.forms import fields class MyForm(Form): user = fields.ChoiceField( # choices=((1, 'ä¸æµ·'), (2, 'å京'),), initial=2, widget=widgets.Select ) def __init__(self, *args, **kwargs): super(MyForm,self).__init__(*args, **kwargs) # self.fields['user'].widget.choices = ((1, 'ä¸æµ·'), (2, 'å京'),) # æ self.fields['user'].widget.choices = models.Classes.objects.all().values_list('id','caption')
æ¹å¼äºï¼
from django import forms from django.forms import fields from django.forms import models as form_model class FInfo(forms.Form): authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all()) # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())
å Django formå ç½®çå段ï¼
Field required=True, æ¯å¦å 许为空 widget=None, HTMLæ件 label=None, ç¨äºçæLabelæ ç¾ææ¾ç¤ºå 容 initial=None, åå§å¼ help_text='', 帮å©ä¿¡æ¯(å¨æ ç¾æè¾¹æ¾ç¤º) error_messages=None, éè¯¯ä¿¡æ¯ {'required': 'ä¸è½ä¸ºç©º', 'invalid': 'æ ¼å¼é误'} show_hidden_initial=False, æ¯å¦å¨å½åæ件åé¢åå ä¸ä¸ªéèçä¸å ·æé»è®¤å¼çæ件ï¼å¯ç¨äºæ£éªä¸¤æ¬¡è¾å ¥æ¯å¦ä¸ç´ï¼ validators=[], èªå®ä¹éªè¯è§å localize=False, æ¯å¦æ¯ææ¬å°å disabled=False, æ¯å¦å¯ä»¥ç¼è¾ label_suffix=None Labelå 容åç¼ CharField(Field) max_length=None, æ大é¿åº¦ min_length=None, æå°é¿åº¦ strip=True æ¯å¦ç§»é¤ç¨æ·è¾å ¥ç©ºç½ IntegerField(Field) max_value=None, æå¤§å¼ min_value=None, æå°å¼ FloatField(IntegerField) ... DecimalField(IntegerField) max_value=None, æå¤§å¼ min_value=None, æå°å¼ max_digits=None, æ»é¿åº¦ decimal_places=None, å°æ°ä½é¿åº¦ BaseTemporalField(Field) input_formats=None æ¶é´æ ¼å¼å DateField(BaseTemporalField) æ ¼å¼ï¼2015-09-01 TimeField(BaseTemporalField) æ ¼å¼ï¼11:12 DateTimeField(BaseTemporalField)æ ¼å¼ï¼2015-09-01 11:12 DurationField(Field) æ¶é´é´éï¼%d %H:%M:%S.%f ... RegexField(CharField) regex, èªå®å¶æ£åè¡¨è¾¾å¼ max_length=None, æ大é¿åº¦ min_length=None, æå°é¿åº¦ error_message=None, 忽ç¥ï¼é误信æ¯ä½¿ç¨ error_messages={'invalid': '...'} EmailField(CharField) ... FileField(Field) allow_empty_file=False æ¯å¦å 许空æ件 ImageField(FileField) ... 注ï¼éè¦PIL模åï¼pip3 install Pillow 以ä¸ä¸¤ä¸ªåå ¸ä½¿ç¨æ¶ï¼éè¦æ³¨æ两ç¹ï¼ - form表åä¸ enctype="multipart/form-data" - viewå½æ°ä¸ obj = MyForm(request.POST, request.FILES) URLField(Field) ... BooleanField(Field) ... NullBooleanField(BooleanField) ... ChoiceField(Field) ... choices=(), é项ï¼å¦ï¼choices = ((0,'ä¸æµ·'),(1,'å京'),) required=True, æ¯å¦å¿ å¡« widget=None, æ件ï¼é»è®¤selectæ件 label=None, Labelå 容 initial=None, åå§å¼ help_text='', 帮å©æ示 ModelChoiceField(ChoiceField) ... django.forms.models.ModelChoiceField queryset, # æ¥è¯¢æ°æ®åºä¸çæ°æ® empty_label="---------", # é»è®¤ç©ºæ¾ç¤ºå 容 to_field_name=None, # HTMLä¸valueçå¼å¯¹åºçå段 limit_choices_to=None # ModelFormä¸å¯¹querysetäºæ¬¡çé ModelMultipleChoiceField(ModelChoiceField) ... django.forms.models.ModelMultipleChoiceField TypedChoiceField(ChoiceField) coerce = lambda val: val 对éä¸çå¼è¿è¡ä¸æ¬¡è½¬æ¢ empty_value= '' 空å¼çé»è®¤å¼ MultipleChoiceField(ChoiceField) ... TypedMultipleChoiceField(MultipleChoiceField) coerce = lambda val: val 对éä¸çæ¯ä¸ä¸ªå¼è¿è¡ä¸æ¬¡è½¬æ¢ empty_value= '' 空å¼çé»è®¤å¼ ComboField(Field) fields=() 使ç¨å¤ä¸ªéªè¯ï¼å¦ä¸ï¼å³éªè¯æ大é¿åº¦20ï¼åéªè¯é®ç®±æ ¼å¼ fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),]) MultiValueField(Field) PS: æ½è±¡ç±»ï¼åç±»ä¸å¯ä»¥å®ç°èåå¤ä¸ªåå ¸å»å¹é ä¸ä¸ªå¼ï¼è¦é åMultiWidgetä½¿ç¨ SplitDateTimeField(MultiValueField) input_date_formats=None, æ ¼å¼å表ï¼['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y'] input_time_formats=None æ ¼å¼å表ï¼['%H:%M:%S', '%H:%M:%S.%f', '%H:%M'] FilePathField(ChoiceField) æ件é项ï¼ç®å½ä¸æ件æ¾ç¤ºå¨é¡µé¢ä¸ path, æä»¶å¤¹è·¯å¾ match=None, æ£åå¹é recursive=False, éå½ä¸é¢çæ件夹 allow_files=True, å 许æ件 allow_folders=False, å 许æ件夹 required=True, widget=None, label=None, initial=None, help_text='' GenericIPAddressField protocol='both', both,ipv4,ipv6æ¯æçIPæ ¼å¼ unpack_ipv4=False 解æipv4å°åï¼å¦ææ¯::ffff:192.0.2.1æ¶åï¼å¯è§£æ为192.0.2.1ï¼ PSï¼protocolå¿ é¡»ä¸ºbothæè½å¯ç¨ SlugField(CharField) æ°åï¼åæ¯ï¼ä¸å线ï¼åå·ï¼è¿åç¬¦ï¼ ... UUIDField(CharField) uuidç±»å Django formå ç½®å段
ä¸ ä¸¤ç§æ ¡éªæ¹å¼ï¼
æ¹å¼ä¸ï¼
from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.validators import RegexValidator class MyForm(Form): user = fields.CharField( validators=[RegexValidator(r'^[0-9]+$', '请è¾å ¥æ°å'), RegexValidator(r'^159[0-9]+$', 'æ°åå¿ é¡»ä»¥159å¼å¤´')], )
æ¹å¼äºï¼
import re from django.forms import Form from django.forms import widgets from django.forms import fields from django.core.exceptions import ValidationError # èªå®ä¹éªè¯è§å def mobile_validate(value): mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') if not mobile_re.match(value): raise ValidationError('ææºå·ç æ ¼å¼é误') class PublishForm(Form): title = fields.CharField(max_length=20, min_length=5, error_messages={'required': 'æ é¢ä¸è½ä¸ºç©º', 'min_length': 'æ é¢æå°ä¸º5个å符', 'max_length': 'æ é¢æå¤ä¸º20个å符'}, widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': 'æ é¢5-20个å符'})) # 使ç¨èªå®ä¹éªè¯è§å phone = fields.CharField(validators=[mobile_validate, ], error_messages={'required': 'ææºä¸è½ä¸ºç©º'}, widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'ææºå·ç '})) email = fields.EmailField(required=False, error_messages={'required': u'é®ç®±ä¸è½ä¸ºç©º','invalid': u'é®ç®±æ ¼å¼é误'}, widget=widgets.TextInput(attrs={'class': "form-control", 'placeholder': u'é®ç®±'}))
æªå®ããã
æºç 解æï¼