博客
关于我
Django表单
阅读量:581 次
发布时间:2019-03-11

本文共 4950 字,大约阅读时间需要 16 分钟。

Django表单使用方式

1. HTML表单与服务器通信

为简单地将前端数据提交到服务器,可以使用标准的 HTML 表单。具体步骤如下:

  • 定义表单:在 HTML 中使用 <form> 标签,可包含多个 <input> 元素和一个提交按钮。表单的 actionmethod 属性可分别指定后端处理 URL 和 HTTP 方法。
  • 提交数据:点击提交按钮,数据通过 HTTP POST 请求发送至服务器端。

2. Django 表单的功能

Django 提供了强大的表单处理功能,主要包括以下步骤:

  • 渲染表单:通过模板引擎渲染展示给用户。
  • 数据验证:确保提交数据格式和内容符合预期。
3. 表单的基本使用流程

以下是使用 Django 表单的一个典型流程:

  • 定义表单类:在 forms.py 文件中继承自 forms.Form,定义必要的字段和验证规则。

    # forms.pyfrom django import formsclass registerForm(forms.Form):    username = forms.CharField(max_length=100, label='用户名',                             min_length=3, error_messages={'min_length': '用户名至少3个字符'})    email = forms.EmailField(label='邮箱', error_messages={'invalid': '请输入有效邮箱'})    password = forms.CharField(max_length=20, label='密码')
  • 渲染表单:在视图中使用 render() 函数,将表单数据传递给模板。

    # views.pydef get(self, request):    form = registerForm()    return render(request, 'register.html', {'form': form})
  • 处理提交数据:在 POST 请求中接收数据,进行验证。如果数据有效,执行保存逻辑。

    def post(self, request):    form = registerForm(request.POST)    if form.is_valid():        username = form.cleaned_data['username']        email = form.cleaned_data['email']        password = form.cleaned_data['password']        # 保存用户信息        user = User.objects.create_user(username, email, password)        return redirect('login')    else:        return render(request, 'register.html', {'form': form})
  • 4. 数据验证

    为了确保子mandata的合法性,Django提供了多种字段类型和验证器。

    4.1 常用字段类型
    • CharField:用于文本内容,支持设置最大值和最小值,以及是否必填。
    • EmailField:用于邮箱,自带验证功能。
    • FloatFieldIntegerField:用于数值,支持Setting最大值和最小值。
    • URLField:用于URL格式,自带验证。
    4.2 验证器

    使用 validators 参数指定验证规则,如最大长度、最小长度、正则表达式等。

    from django.core.validators import (    MinLengthValidator,    MaxLengthValidator,    RegexValidator,)class registerForm(forms.Form):    username = forms.CharField(        max_length=100,        min_length=3,        validators=[            MinLengthValidator(),            MaxLengthValidator(max_value=100)        ],        error_messages={'required': '请填写用户名'}    )
    4.3 自定义验证

    对于复杂的验证逻辑(如手机号码是否已存在或密码是否一致),可以通过自定义方法实现。

    class CustomRegisterForm(forms.Form):    telephone = forms.CharField(        validators=[            validators.RegexValidator(regex='^\d{11}$', message='请输入正确的手机号码')        ]    )    def clean_telephone(self):        telephone = self.cleaned_data.get('telephone')        if User.objects.filter(telephone=telephone).exists():            raise forms.ValidationError(f'这样电话号码已经注册过了')        return telephone    password1 = forms.CharField(min_length=6)    password2 = forms.CharField(min_length=6)    def clean(self):        super().clean()        if self.cleaned_data.get('password1') != self.cleaned_data.get('password2'):            raise forms.ValidationError('密码不一致')

    5. 模型与表单的结合

    使用 ModelForm 类,可以直接与数据库模型绑定,简化字段配置。

    # models.pyfrom django.db import modelsclass User(models.Model):    username = models.CharField(max_length=100)    email = models.EmailField()    password = models.CharField(max_length=20)
    # forms.pyfrom django import formsfrom .models import Userclass registerForm(forms.ModelForm):    class Meta:        model = User        fields = ('username', 'email', 'password')    def clean(self):        if self.cleaned_data['username'] == self.cleaned_data['email']:            raise forms.ValidationError('用户名不能等于邮箱')

    6. 文件上传

    为了上传文件,需要在模板中设置 enctype="multipart/form-data",并使用 <input type="file">

    在 Django 中,文件字段使用 FileField 定义,upload_to 参数指定保存路径。

    from django.db import modelsfrom django.core import validatorsclass Article(models.Model):    image = models.FileField(        upload_to='%Y/%m/%d/',        validators=[            validators.FileExtensionValidator(['png', 'jpg'])        ]    )

    在视图中接受文件:

    def post(self, request):    image = request.FILES.get('image')    if image:        # 保存文件        file_path = os.path.join('uploads', image.name)        with open(file_path, 'wb') as f:            for chunk in image.chunks():                f.write(chunk)        return success()

    7. 自定义错误信息

    为了提高用户体验,可以设置自定义的错误信息。

    from django import formsclass registerForm(forms.Form):    username = forms.CharField(max_length=100,                            label='用户名',                            min_length=3,                            error_messages={                                'required': '用户名不可为空',                                'min_length': '用户名至少3个字符'                            })    # 其他字段同上...

    8. 模型与表单结合使用

    使用 ModelForm 进行验证和保存,可以减少重复配置字段。

    class registerForm(forms.ModelForm):    class Meta:        model = User        fields = ('username', 'email')        error_messages = {            'username': {'required': '请填写用户名'},            'email': {'required': '请填写邮箱'}        }    # 定义自定义验证方法    def clean_password(self):        password = self.cleaned_data.get('password')        if len(password) < 6:            raise forms.ValidationError('密码长度不够')        return password

    总结

    通过以上步骤,可以理解和掌握Django中的表单处理流程。从基本的HTML表单到Django的强大表单功能,再到复杂的数据验证和文件上传,Django提供了丰富的工具来处理各种场景。在实际开发中,建议结合具体项目需求,选择合适的表单类型,并进行相应验证和处理。

    转载地址:http://oobtz.baihongyu.com/

    你可能感兴趣的文章
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>
    Mysql: 对换(替换)两条记录的同一个字段值
    查看>>
    mysql:Can‘t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock‘解决方法
    查看>>
    MYSQL:基础——3N范式的表结构设计
    查看>>
    MYSQL:基础——触发器
    查看>>
    Mysql:连接报错“closing inbound before receiving peer‘s close_notify”
    查看>>
    mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
    查看>>
    mysqldump 参数--lock-tables浅析
    查看>>
    mysqldump 导出中文乱码
    查看>>
    mysqldump 导出数据库中每张表的前n条
    查看>>
    mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
    查看>>
    Mysqldump参数大全(参数来源于mysql5.5.19源码)
    查看>>