Django 의 forms 구성 요소 인 스 턴 스 상세 설명

양식 소개
Google 은 이전에 HTML 페이지 에서 form 폼 을 이용 하여 백 엔 드 에 데 이 터 를 제출 할 때 사용자 가 입력 한 탭 을 작성 하고 form 탭 으로 패키지 합 니 다.
이 동시에 우 리 는 많은 장면 에서 사용자 의 입력 을 검증 해 야 한다.예 를 들 어 사용자 가 입력 했 는 지,입력 한 길이 와 형식 등 이 정확 하지 않다.사용자 가 입력 한 내용 에 오류 가 있 으 면 페이지 의 해당 위치 에 해당 하 는 오류 정 보 를 표시 해 야 합 니 다.
Django form 구성 요 소 는 위 에서 말 한 기능 을 실현 합 니 다.
요약 하면 form 구성 요소 의 주요 기능 은 다음 과 같 습 니 다.
  • 페이지 에 사용 가능 한 HTML 탭 생 성
  • 사용자 가 제출 한 데 이 터 를 검증 합 니 다
  • 마지막 입력 내용 유지
  • 응용 디 렉 터 리 에 myforms.py 사용자 Form 클래스 정의
    
    from django import forms
     from django.forms import widgets 
       class UserForm(forms.Form):
         username = forms.CharField(min_length=4, label='   ',
                       widget=widgets.TextInput(attrs={"class": "form-control"}),
                       error_messages={
                         "required": "       ",
                       })
         pwd = forms.CharField(min_length=4, label='  ',
                    error_messages={
                      "required": "      ",
                    },
                    widget=widgets.PasswordInput(attrs={"class": "form-control"}))
         r_pwd = forms.CharField(min_length=4, label='    ',
                     widget=widgets.PasswordInput(attrs={"class": "form-control"}),
                     error_messages={
                       "required": "      ",
                     })
         email = forms.EmailField(label='  ',
                     widget=widgets.EmailInput(attrs={"class": "form-control"}),
                     error_messages={
                       "required": '      ',
                       "invalid": "      ",
                     })
         tel = forms.CharField(label='   ',
                    widget=widgets.TextInput(attrs={"class": "form-control"}),
                    )
    보기 함수 다시 쓰기:
      보기 함수 쓰기
    
       def reg(request):
         form = UserForm()
         if request.method == "POST":
           print(request.POST)
           #    form     , post            
           form = UserForm(request.POST) # form   name      forms         
           if form.is_valid():
             print(form.cleaned_data)
             return HttpResponse('    ')
         return render(request, 'reg.html', locals())
    login.html
    
      <!DOCTYPE html>
       <html lang="zh_CN">
       <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>  </title>
       </head>
       <body>
       <h3>  form  </h3>
       <form action="" method="post">
         {% csrf_token %}
         <p>   :<input type="text" name="username"></p>
         <p>  :<input type="password" name="pwd"></p>
         <p>    :<input type="password" name="r_pwd"></p>
         <p>  :<input type="email" name="email"></p>
         <p>   :<input type="tel" name="tel"></p>
         <p><input type="submit" value="  "></p>
       </form>
       <h3>forms      1</h3>
       <form action="" method="post" novalidate>
         {% csrf_token %}
         <p>{{ form.username.label }}:{{ form.username }} <span>{{ form.username.errors.0 }}</span></p>
         <p>  :{{ form.pwd }}
           <span>{{ form.pwd.errors.0 }}</span></p>
         <p>    :{{ form.r_pwd }}
           <span>{{ form.r_pwd.errors.0 }}</span></p>
         <p>  :{{ form.email }}
           <span>{{ form.email.errors.0 }}</span></p>
         <p>   :{{ form.tel }}
           <span>{{ form.tel.errors.0 }}</span></p>
         <p><input type="submit" value="  "></p>
       </form>
       <h3>forms        2</h3>
         <form action="" method="post" novalidate>
           {% csrf_token %}
           {% for field in form %}
             <div class="form-group clearfix">
               <label for="">{{ field.label }}</label>
               {{ field }}
               <span style="color: red" class="pull-right">{{ field.errors.0 }}</span>
               {% if field.name == 'r_pwd' %}
                 <span style="color: red" class="pull-right">{{ errors.0 }}</span>
               {% endif %}
             </div>
           {% endfor %}
           <input type="submit" value="  " class="btn btn-default pull-right">
         </form>
       <h3>forms        3       </h3>
       <form action="" method="post">
         {% csrf_token %}
         {{ form.as_p }}
         <input type="submit" value="  ">
       </form>
       </body>
       </html>
    웹 페이지 효 과 를 보 니 form 의 기능 도 검증 되 었 습 니 다.
    •전단 페이지 는 form 클래스 의 대상 이 생 성 합 니 다.                                      -->HTML 태그 생 성 기능
    •사용자 이름과 비밀번호 가 비어 있 거나 잘못 입력 되면 페이지 가 알려 집 니 다.        -->사용자 제출 검사 기능
    •사용자 가 잘못 진 후에 마지막 내용 을 다시 입력 하면 input 상자 에 남아 있 습 니 다.   -->마지막 입력 내용 유지
    그런 일 들 을 만들어 라.
    상용 필드 와 플러그 인
    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
    단일 라디오 값 문자열
    
    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()
      )
    단일 선택
    
    class LoginForm(forms.Form):
      ...
      hobby = forms.fields.ChoiceField(
        choices=((1, "  "), (2, "  "), (3, "   "), ),
        label="  ",
        initial=3,
        widget=forms.widgets.Select()
      )
    다 중 선택
    
    class LoginForm(forms.Form):
      ...
      hobby = forms.fields.MultipleChoiceField(
        choices=((1, "  "), (2, "  "), (3, "   "), ),
        label="  ",
        initial=[1, 3],
        widget=forms.widgets.SelectMultiple()
      )
    체크 박스
    
    class LoginForm(forms.Form):
      ...
      keep = forms.fields.ChoiceField(
        label="      ",
        initial="checked",
        widget=forms.widgets.CheckboxInput()
      )
    다 중 선택 체크 박스
    
    class LoginForm(forms.Form):
      ...
      hobby = forms.fields.MultipleChoiceField(
        choices=((1, "  "), (2, "  "), (3, "   "),),
        label="  ",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple()
      )
    choice 에 대한 주의사항:
    탭 을 선택 할 때 choices 옵션 을 데이터베이스 에서 가 져 올 수 있 음 을 주의해 야 합 니 다.그러나 정적 필드**로 가 져 온 값 은 실시 간 으로***를 업데이트 할 수 없 기 때문에 사용자 정의 구조 방법 이 필요 합 니 다.
    방식 1:
    
    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'].choices = ((1, '  '), (2, '  '),)
        #  
        self.fields['user'].choices = models.Classes.objects.all().values_list('id','caption')
    방식 2:
    
    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': '    '}
      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 내장 필드
    검사 하 다
    방식 1:
    
    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  ')],
      )
    방식 2:
    
    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'  '}))
    방식 3:
    
     def clean(self):
         pwd = self.cleaned_data.get('pwd')
         r_pwd = self.cleaned_data.get('r_pwd')
         print(pwd, r_pwd)
         if pwd and r_pwd:
           if pwd == r_pwd:
             return self.cleaned_data
           raise ValidationError('       ')
         else:
           return self.cleaned_data
       def clean_username(self):
         val = self.cleaned_data.get('username')
         user = UserInfo.objects.filter(name=val)
         if not user:
           return val
         else:
           raise ValidationError("      ")
       def clean_tel(self):
         val = self.cleaned_data.get('tel')
         if len(val) == 11:
           return val
         raise ValidationError('       ')
    
    요약:
    
    '''
           :
         1、is_valid()
         2、self.errors
         3、self.full_clean()
         4、self._clean_fields()        
        5、for         、      
         6、
               :
             value = field.clean(value)
             self.cleaned_data[name] = value          clean_data 
                 、         
             hasattr(self, 'clean_%s' % name)            
             value = getattr(self, 'clean_%s' % name)()        
               pass:
                 self.cleaned_data[name] = value      clean_data 
               no_pass:
                 raise ValidationError(msg)         
              :
             raise ValidationError(msg)
           :
         1、is_valid()
         2、self.errors
         3、self.full_clean() 
         4、self._clean_form()               
         5、self.clean()   clean  
         6、      :forms.errors.get("__all__")
       '''
    총결산
    위 에서 말 한 것 은 소 편 이 소개 한 Django 의 forms 구성 요소 인 스 턴 스 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기