Py学习  »  Django

django2中表单的使用一

水痕001 • 5 年前 • 389 次点击  
阅读 4

django2中表单的使用一

一、使用django中自带的表单步骤主要有

  • 1、创建一个项目

  • 2、创建一个app

  • 3、在app里面创建一个forms.py的文件

  • 4、在forms.py中定义字段

    from django import forms
    
    
    class MessageForm(forms.Form):
        """
        message的表单校验的
        """
        title = forms.CharField(max_length=100, min_length=2, label='标题')
        content = forms.CharField(widget=forms.Textarea, label='内容')
        email = forms.EmailField(label='邮箱')
        replay = forms.BooleanField(required=False, label='是否记住密码 ')
    复制代码
  • 5、使用自带的表单方式生成前端html页面

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.views import View
    from . import forms
    from . import models
    
    
    class MessageView(View):
        def get(self, request, *args, **kwargs):
            form = forms.MessageForm()
            return render(request, 'message.html', context={'form': form})
       ...
    复制代码
  • 6、前端代码

    <form action="/message/" method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
            <tr>
                <td></td>
                <td>
                    <input type="submit" value="提交">
                </td>
            </tr>
        </table>
    </form>
    复制代码
  • 7、使用表单校验及获取输入框的值

    class MessageView(View):
        def get(self, request, *args, **kwargs):
            form = forms.MessageForm()
            return render(request, 'message.html', context={'form': form})
    
        def post(self, request, *args, **kwargs):
            form = forms.MessageForm(request.POST)
            if form.is_valid():
                print('表单校验成功')
                title = form.cleaned_data.get('title')
                content = form.cleaned_data.get('content')
                email = form.cleaned_data.get('email')
                replay = form.cleaned_data.get('replay')
                print(title, content, email, replay)
                return HttpResponse('成功')
            else:
                print('表单校验失败')
                return HttpResponse('失败')
    复制代码

二、在表单中定义自己的错误提示

  • 1、直接在表单中定义

    class MessageForm(forms.Form):
        """
        message的表单校验的
        """
        title = forms.CharField(max_length=100, min_length=2, label='标题', error_messages={'min_length': '最小是2个字符', 'max_length': '最大是100个字符'})
        content = forms.CharField(widget=forms.Textarea, label='内容', error_messages={'required': '必须写内容'})
        email = forms.EmailField(label='邮箱', error_messages={'required': '邮箱必填'})
        replay = forms.BooleanField(required=False, label='是否记住密码 ')
    
    复制代码

三、关于表单中常用的字段

  • 1、CharField
    • max_length这个字段最大长度
    • min_length这个字段最小长度
    • required这个字段必填的,默认是必填的
    • error_messages错误提示
  • 2、EmailField
    • required必须填的
    • invalid无效的
  • 3、IntegerField
    • max_value最大值
    • min_value最小值
  • 4、直接使用正则表达式

四、自定义校验器

  • 1、直接使用正则表达式

    from django.core import validators
    
    class MessageForm(forms.Form):
        """
        message的表单校验的
        """
    
       mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
    复制代码
  • 2、异步校验(根据用户输入的手机号码判断数据库里面是否已经有了)

    
    
    
        
    class RegisterForm(forms.Form):
        """
        用户注册的form
        """
        username = forms.CharField(max_length=18, min_length=3,
                                   error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
        mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
    
        def clean_mobile(self):
            """
            自定义从数据库校验手机号码
            :return:
            """
            mobile = self.cleaned_data.get('mobile')
            exists = models.User.objects.filter(mobile=mobile).exists()
            if exists:
                raise forms.ValidationError(message='{}手机号码已经存在'.format(mobile))
            return mobile
    复制代码
  • 3、多字段的校验(常见密码的校验)

    class RegisterForm(forms.Form):
        """
        用户注册的form
        """
        username = forms.CharField(max_length=18, min_length=3,
                                   error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
        mobile = forms.CharField(validators=[validators.RegexValidator(r'1[345678]\d{9}', message='手机号码错误')])
        pwd1 = forms.CharField(max_length=18, min_length=6,
                               error_messages={'max_length': '最多16个字符', 'min_length': '最小6个字符'})
        pwd2 = forms.CharField(max_length=18, min_length=6,
                               error_messages={'max_length': '最多16个字符', 'min_length': '最小6个字符'})
    
        def clean_mobile(self):
            """
            自定义从数据库校验手机号码
            :return:
            """
            mobile = self.cleaned_data.get('mobile')
            exists = models.User.objects.filter(mobile=mobile).exists()
            if exists:
                raise forms.ValidationError(message='{}手机号码已经存在'.format(mobile))
            return mobile
    
        def clean(self):
            clean_data = super().clean()
            pwd1 = clean_data.get('pwd1')
            pwd2 = clean_data.get('pwd2')
            if pwd1 != pwd2:
                raise forms.ValidationError(message='两次密码不一致')
            return clean_data
    复制代码

五、自己封装一个返回用户输入错误的信息提示

  • 1、直接在form的类中定义

    class RegisterForm(forms.Form):
        """
        用户注册的form
        """
        username = forms.CharField(max_length=18, min_length=3, error_messages={'max_length': '最多18个字符', 'min_length': '最小3个字符'})
    
       ....
    
        def get_errors(self):
            """
            自己封装一个错误的返回
            :return:
            """
            errors = self.errors.get_json_data()
            new_errors = {}
            for key, message_dicts in errors.items():
                messages = []
                for message_dict in message_dicts:
                    message = message_dict['message']
                    messages.append(message)
                new_errors[key] = messages
            return new_errors
    复制代码
  • 2、直接在视图中调用函数就可以获取错误信息

    class MessageView(View):
        def get(self, request, *args, **kwargs):
            form = forms.MessageForm()
            return render(request, 'message.html', context={'form': form})
    
        def post(self, request, *args, **kwargs):
            form = forms.MessageForm(request.POST)
            if form.is_valid():
                print('表单校验成功')
                ...
                return HttpResponse('成功')
            else:
                print('表单校验失败')
                print(form.get_errors())
                return HttpResponse('失败')
    复制代码
  • 3、如果想所有的表单中都具备get_errors方法,可以将他提取到一个公共的基类中

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31894
 
389 次点击