博客
关于我
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/

    你可能感兴趣的文章
    MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
    查看>>
    mxGraph改变图形大小重置overlay位置
    查看>>
    MongoDB可视化客户端管理工具之NoSQLbooster4mongo
    查看>>
    Mongodb学习总结(1)——常用NoSql数据库比较
    查看>>
    MongoDB学习笔记(8)--索引及优化索引
    查看>>
    mongodb定时备份数据库
    查看>>
    mppt算法详解-ChatGPT4o作答
    查看>>
    mpvue的使用(一)必要的开发环境
    查看>>
    MQ 重复消费如何解决?
    查看>>
    mqtt broker服务端
    查看>>
    MQTT 保留消息
    查看>>
    MQTT 持久会话与 Clean Session 详解
    查看>>
    MQTT工作笔记0007---剩余长度
    查看>>
    MQTT工作笔记0009---订阅主题和订阅确认
    查看>>
    Mqtt搭建代理服务器进行通信-浅析
    查看>>
    MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
    查看>>
    ms sql server 2008 sp2更新异常
    查看>>
    MS UC 2013-0-Prepare Tool
    查看>>
    MSBuild 教程(2)
    查看>>
    msbuild发布web应用程序
    查看>>