django formsフォーム

44489 ワード

目次:
  • formsフォーム紹介
  • forms共通フィールドとプラグイン
  • formsすべての組み込みフィールド
  • 正規検査フィールド
  • フック関数カスタムチェック
  • FORMSの紹介
    多くのアプリケーションシーンでは、ユーザーが入力したかどうかを検証したり、入力の長さやフォーマットが正しくないなど、ユーザーの入力を検証する必要があります.ユーザが入力した内容にエラーがある場合は、ページ上の対応する位置にエラー情報を表示する必要がある.
    formコンポーネントの主な機能は以下の通りです.
  • ページで使用可能なHTMLタグ
  • を生成する.
  • ユーザが提出するデータを検証する
  • .
  • 前回入力内容
  • を保持する.
    基本的にformsコンポーネントを使用して登録機能を実現
    views.py
    #       RegForm :
    
    from django import forms
    
    #   Django form           
    class RegForm(forms.Form):
        name = forms.CharField(label="   ")
        pwd = forms.CharField(label="  ")
    

    ビュー関数をもう1つ書きます.
    #   form        
    def register2(request):
        form_obj = RegForm()
        if request.method == "POST":
            #    form     , post            
            form_obj = RegForm(request.POST)
            #   form_obj       
            if form_obj.is_valid():
                return HttpResponse("    ")
        return render(request, "register2.html", {"form_obj": form_obj})
    
    '''
    #           
    obj.is_valid()
    #          
    obj.errors
    {'password': ['Ensure this value has at least 3 characters (it has 2).'],
     'email': ['Enter a valid email address.']}
    #          
    obj.cleaned_data
    '''
    

    login2.html
    
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>  2title>
    head>
    <body>
        <form action="/reg2/" method="post" novalidate autocomplete="off">
            {% csrf_token %}
            <div>
                <label for="{{ form_obj.name.id_for_label }}">{{ form_obj.name.label }}label>
                {{ form_obj.name }} {{ form_obj.name.errors.0 }}
            div>
            <div>
                <label for="{{ form_obj.pwd.id_for_label }}">{{ form_obj.pwd.label }}label>
                {{ form_obj.pwd }} {{ form_obj.pwd.errors.0 }}
            div>
            <div>
                <input type="submit" class="btn btn-success" value="  ">
            div>
        form>
    body>
    html>
    
    // forms        input   form   submit           
    

    まとめ:•フロントエンドページはformクラスのオブジェクトから生成される-->HTMLタグ機能の生成•ユーザー名とパスワードの入力が空または間違っている場合はページにプロンプトが表示される-->ユーザーがチェック機能をコミットする•ユーザーが間違っている場合は前回の内容を再度入力してinputボックスに残す-->前回の入力内容を保持する
    カタログに戻る
    forms共通フィールドとプラグイン
    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.ChoiceField(
            choices=((1, "  "), (2, "  "), (3, "   "), ),
            label="  ",
            initial=3,
            widget=forms.widgets.Select()
        )
    
    #   Select
    
    class LoginForm(forms.Form):
        ...
        hobby = forms.MultipleChoiceField(
            choices=((1, "  "), (2, "  "), (3, "   "), ),
            label="  ",
            initial=[1, 3],
            widget=forms.widgets.SelectMultiple()
        )
    
    #   checkbox
    
    class LoginForm(forms.Form):
        ...
        keep = forms.ChoiceField(
            label="      ",
            initial="checked",
            widget=forms.widgets.CheckboxInput()
        )
    
    #   checkbox
    
    class LoginForm(forms.Form):
        ...
        hobby = forms.MultipleChoiceField(
            choices=((1, "  "), (2, "  "), (3, "   "),),
            label="  ",
            initial=[1, 3],
            widget=forms.widgets.CheckboxSelectMultiple()
        )
    
    # choice      
    #         ,    choices              ,                    ,            choice    。
    
    #    :
    
    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')
            
    #    :
    
    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())  #   
    

    カタログに戻る
    formsすべての組み込みフィールド
    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  
    

    カタログに戻る
    正規検査フィールド
    RegexValidatorベリファイア
    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  ')],
        )
    

    カタログに戻る
    フック関数カスタムチェック
    ローカルフック
    Fomクラスでclean_を定義しますフィールド名()メソッドにより、特定のフィールドを検証できます.
    class LoginForm(forms.Form):
        username = forms.CharField(
            min_length=8,
            label="   ",
            initial="  ",
            error_messages={
                "required": "    ",
                "invalid": "    ",
                "min_length": "     8 "
            },
            widget=forms.widgets.TextInput(attrs={"class": "form-control"})
        )
        ...
        #       ,    username  
        def clean_username(self):
            value = self.cleaned_data.get("username")
            if "666" in value:
                raise ValidationError("  666    ")
            else:
                return value
    

    グローバルフック
    Fomクラスでclean()メソッドを定義すると,フィールドのグローバル検証を実現できる.
    class LoginForm(forms.Form):
        ...
        password = forms.CharField(
            min_length=6,
            label="  ",
            widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}, render_value=True)
        )
        re_password = forms.CharField(
            min_length=6,
            label="    ",
            widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}, render_value=True)
        )
        ...
        #        ,                 
        def clean(self):
            password_value = self.cleaned_data.get('password')
            re_password_value = self.cleaned_data.get('re_password')
            if password_value == re_password_value:
                return self.cleaned_data
            else:
                self.add_error('re_password', '       ')
                raise ValidationError('       ')
    

    カタログに戻る