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

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

Django表单使用方式

1. HTML表单与服务器通信

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

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

2. Django 表单的功能

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

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

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

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

    # forms.py
    from django import forms
    class 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.py
    def 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.py
    from django.db import models
    class User(models.Model):
    username = models.CharField(max_length=100)
    email = models.EmailField()
    password = models.CharField(max_length=20)
    # forms.py
    from django import forms
    from .models import User
    class 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 models
    from django.core import validators
    class 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 forms
    class 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/

    你可能感兴趣的文章
    Objective-C实现collatz sequence考拉兹序列算法(附完整源码)
    查看>>
    Objective-C实现Collatz 序列算法(附完整源码)
    查看>>
    Objective-C实现combinations排列组合算法(附完整源码)
    查看>>
    Objective-C实现combine With Repetitions结合重复算法(附完整源码)
    查看>>
    Objective-C实现combine Without Repetitions不重复地结合算法(附完整源码)
    查看>>
    Objective-C实现conjugate gradient共轭梯度算法(附完整源码)
    查看>>
    Objective-C实现connected components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Connected Components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Convex hull凸包问题算法(附完整源码)
    查看>>
    Objective-C实现convolution neural network卷积神经网络算法(附完整源码)
    查看>>
    Objective-C实现convolve卷积算法(附完整源码)
    查看>>
    Objective-C实现coulombs law库仑定律算法(附完整源码)
    查看>>
    Objective-C实现counting sort计数排序算法(附完整源码)
    查看>>
    Objective-C实现countSetBits设置位的数量算法(附完整源码)
    查看>>
    Objective-C实现currency converter货币换算算法(附完整源码)
    查看>>
    Objective-C实现cycle sort循环排序算法(附完整源码)
    查看>>
    Objective-C实现data transformations数据转换算法(附完整源码)
    查看>>
    Objective-C实现DBSCAN聚类算法(附完整源码)
    查看>>
    Objective-C实现DBSCAN聚类算法(附完整源码)
    查看>>
    Objective-C实现decision tree决策树算法(附完整源码)
    查看>>