• Django---form 详解


    Form表单的功能

    • 准备数据、重构数据,以便下一步提交。
    • 为数据创建HTML 表单
    • 接收并处理客户端提交的表单和数据

    普通字段详解:

    class BooleanField(**kwargs):
        默认的Widget:CheckboxInput
        空值:False
        规范化为:Python 的True 或 False。
        如果字段带有required=True,验证值是否为True(例如复选框被勾上)。 
        错误信息的键:required
    布尔值 checkbox
    class CharField(**kwargs):
    默认的Widget:TextInput
    空值:''(一个空字符串)
    规范化为:一个Unicode 对象。
    如果提供,验证max_length 或min_length。 否则,所有的输入都是合法的。
    错误信息的键:required, max_length, min_length
    有两个参数用于验证:
    
    max_length
    min_length
    如果提供,这两个参数将确保字符串的最大和最小长度。
    charFied input()
    class ChoiceField(**kwargs)¶
    默认的Widget:Select
    空值:''(一个空字符串)
    规范化为:一个Unicode 对象。
    验证给定的值在选项列表中存在。
    错误信息的键:required, invalid_choice
    invalid_choice 错误消息可能包含%(value)s,它将被选择的选项替换掉。
    
    接收一个额外的必选参数:choices
    用来作为该字段选项的一个二元组组成的可迭代对象(例如,列表或元组)或者一个可调用对象。
    例如:
    YEAR_IN_SCHOOL_CHOICES = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
    )
    ChoiceField (select标签)
    class DateField(**kwargs):
    默认的Widget:DateInput
    空值:None
    规范化为:一个Python datetime.date 对象。
    验证给出的值是一个datetime.date、datetime.datetime 或指定日期格式的字符串。
    错误信息的键:required, invalid
    接收一个可选的参数:
    
    input_formats
    一个格式的列表,用于转换一个字符串为datetime.date 对象。
    DateField Dateinput 标签
    class EmailField(**kwargs)
    默认的Widget:EmailInput
    空值:''(一个空字符串)
    规范化为:一个Unicode 对象。
    验证给出的值是一个合法的邮件地址,使用一个适度复杂的正则表达式。
    错误信息的键:required, invalid
    具有两个可选的参数用于验证,max_length 和min_length。如果提供,这两个参数确保字符串的最大和最小长度。
    emailField EaillInput
    class FileField(**kwargs)¶
    默认的Widget:ClearableFileInput
    空值:None
    规范化为:一个UploadedFile 对象,它封装文件内容和文件名为一个单独的对象。
    可以验证非空的文件数据已经绑定到表单。
    错误信息的键:required, invalid, missing, empty, max_length
    具有两个可选的参数用于验证,max_length 和 allow_empty_file。如果提供,这两个参数确保文件名的最大长度,而且即使文件内容为空时验证也会成功。
    FileField
    class ImageField(**kwargs)¶
    默认的Widget:ClearableFileInput
    空值:None
    规范化为: An UploadedFile object that wraps the file content and file name into a single object.
    验证文件数据已绑定到表单,并且该文件具有Pillow理解的图像格式。
    错误信息的键:required, invalid, missing, empty, invalid_image
    使用ImageField需要安装Pillow并支持您使用的图像格式。如果在上传图片时遇到损坏 图像错误,通常意味着Pillow不了解其格式。要解决这个问题,请安装相应的库并重新安装Pillow。
    ImageField
    class MultipleChoiceField(**kwargs)¶
    默认的Widget:SelectMultiple
    空值:[](一个空列表)
    规范化为:一个Unicode 对象列表。
    验证给定值列表中的每个值都存在于选择列表中。
    错误信息的键:required, invalid_choice, invalid_list
    invalid_choice错误消息可能包含%(value)s,将替换为所选择的选项。
    
    对于ChoiceField,需要一个额外的必需参数choices。
    MultipleChoiceField (select标签 multiple)

    处理关系的字段:

    两个字段可用于表示模型之间的关系:ModelChoiceFieldModelMultipleChoiceField这两个字段都需要单个queryset参数,用于创建字段的选择。

    class ModelChoiceField(**kwargs)¶
    默认的Widget:Select
    空值:None
    规范化为:一个模型实例。
    验证给定的id存在于查询集中。
    错误信息的键:required, invalid_choice
    可以选择一个单独的模型对像,适用于表示一个外键字段。 ModelChoiceField默认widet不适用选择数量很大的情况,在大于100项时应该避免使用它。
    
    需要单个参数:
    queryset
    将导出字段选择的模型对象的QuerySet,将用于验证用户的选择。
    ModelChoiceField也有两个可选参数:
    empty_label
    默认情况下,ModelChoiceField使用的<select>小部件将在列表顶部有一个空选项。您可以使用empty_label属性更改此标签的文本(默认为"---------"),也可以禁用空白标签完全通过将empty_label设置为None:
    to_field_name
    此可选参数用于指定要用作字段窗口小部件中选项的值的字段。确保它是模型的唯一字段,否则选定的值可以匹配多个对象。默认情况下,它设置为None,在这种情况下,将使用每个对象的主键。
    例如:
    field1 = forms.ModelChoiceField(queryset=...)
    <select id="id_field1" name="field1">
    <option value="obj1.pk">Object1</option>
    <option value="obj2.pk">Object2</option>
    ...
    </select>
    ModelChoiceField
    class ModelMultipleChoiceField(**kwargs)
    默认的Widget:SelectMultiple
    空值:QuerySet (self.queryset.none())
    规范化为: 模型实例的一个QuerySet。
    验证在给定的值列表中的每个id存在于查询集中。
    错误信息的键:required, list, invalid_choice, invalid_pk_value
    invalid_choice消息可以包含%(value)s并且invalid_pk_value消息可以包含%(pk)s其将被适当的值代替。
    
    允许选择适合于表示多对多关系的一个或多个模型对象。与ModelChoiceField一样,您可以使用label_from_instance自定义对象表示,queryset是必需的参数:
    
    queryset
    将导出字段选择的模型对象的QuerySet,将用于验证用户的选择。
    ModelMultipleChoiceField

    表单里choice用的数据库里数据时不会实时更新。所以需要将choice放到init里,每次使用都执行一遍:

    class FooMultipleChoiceForm(forms.Form):
        foo_select = forms.ModelMultipleChoiceField(queryset=None)
    
        def __init__(self, *args, **kwargs):
            super(FooMultipleChoiceForm, self).__init__(*args, **kwargs)
            self.fields['foo_select'].queryset = ...
    示例

    字段的核心参数:

    required

       f = forms.CharField(required=False)
      默认为True。

    label

    >>> from django import forms
    >>> class CommentForm(forms.Form):
    ...     name = forms.CharField(label='Your name')
    ...     url = forms.URLField(label='Your Web site', required=False)
    ...     comment = forms.CharField()
    >>> f = CommentForm(auto_id=False)
    >>> print(f)
    <tr><th>Your name:</th><td><input type="text" name="name" /></td></tr>
    <tr><th>Your Web site:</th><td><input type="url" name="url" /></td></tr>
    <tr><th>Comment:</th><td><input type="text" name="comment" /></td></tr>

    error_messages:

    error_messages 参数让你覆盖字段引发的异常中的默认信息。传递的是一个字典,其键为你想覆盖的错误信息

    has_changed():方法用于决定字段的值是否从初始值发生了改变。返回True 或False

    字段数据:

    不管表单提交的是什么数据,一旦通过调用is_valid() 成功验证(is_valid() 返回True),验证后的表单数据将位于form.cleaned_data 字典中。

    from django.core.mail import send_mail
    
    if form.is_valid():
        subject = form.cleaned_data['subject']
        message = form.cleaned_data['message']
        sender = form.cleaned_data['sender']
        cc_myself = form.cleaned_data['cc_myself']
    
        recipients = ['info@example.com']
        if cc_myself:
            recipients.append(sender)
    
        send_mail(subject, message, sender, recipients)
        return HttpResponseRedirect('/thanks/')

    重写验证方法:

      # 自定义方法(局部钩子),密码必须包含字母和数字
      def clean_password(self):
          if self.cleaned_data.get('password').isdigit() or self.cleaned_data.get('password').isalpha():
              raise ValidationError('密码必须包含数字和字母')
          else:
              return self.cleaned_data['password']
     
      def clean_valid_code(self):  # 检验验证码正确;之前生成的验证码保存在了了session中
          if self.cleaned_data.get('valid_code').upper() == self.request.session.get('valid_code'):
              return self.cleaned_data['valid_code']
          else:
              raise ValidationError('验证码不正确')
     
      # 自定义方法(全局钩子, 检验两个字段),检验两次密码一致;
      def clean(self):
          if self.cleaned_data.get('password') != self.cleaned_data.get('password2'):
              raise ValidationError('密码不一致')
          else:
              return self.cleaned_data
     
      # 注意,上面的字典取值用get, 因为假如在clean_password中判断失败,那么没有返回值,最下面的clean方法直接取值就会失败s 

    使用表单模:

    • {{ form.as_table }} 以表格的形式将它们渲染在<tr> 标签中
    • {{ form.as_p }}  将它们渲染在<p> 标签中
    • {{ form.as_ul }} 将它们渲染在<li> 标签中

    手工渲染字段:{{ form.name_of_field }

    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="{{ form.subject.id_for_label }}">Email subject:</label>
        {{ form.subject }}
    </div>
    <div class="fieldWrapper">
        {{ form.message.errors }}
        <label for="{{ form.message.id_for_label }}">Your message:</label>
        {{ form.message }}
    </div>
    <div class="fieldWrapper">
        {{ form.sender.errors }}
        <label for="{{ form.sender.id_for_label }}">Your email address:</label>
        {{ form.sender }}
    </div>
    <div class="fieldWrapper">
        {{ form.cc_myself.errors }}
        <label for="{{ form.cc_myself.id_for_label }}">CC yourself?</label>
        {{ form.cc_myself }}
    </div>
    示例

    渲染表单的错误信息:{{ form.name_of_field.errors }}

    迭代表单的字段{{ field }} 包含所有有用的属性

    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
        </div>
    {% endfor %}

    可重用的表单模板:

    在表单保存到单独的模块,用includ标签来重用

    {% include "form_snippet.html" %}
    
    # In form_snippet.html:
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
        </div>
    {% endfor %}

    widgets窗口小部件 

    widgets.attr 设置标签属性

    class CommentForm(forms.Form):
        name = forms.CharField(widget=forms.TextInput(attrs={'class': 'special'}))
        url = forms.URLField()
        comment = forms.CharField(widget=forms.TextInput(attrs={'size': '40'}))
    
    
    >>> f = CommentForm(auto_id=False)
    >>> f.as_table()
    <tr><th>Name:</th><td><input type="text" name="name" class="special"/></td></tr>
    <tr><th>Url:</th><td><input type="url" name="url"/></td></tr>
    <tr><th>Comment:</th><td><input type="text" name="comment" size="40"/></td></tr
    生成form field对象,指定类型
    from django.form impor widgets,fields
    
    xxxx = fields.CharField(widget=widgets.Textarea)
  • 相关阅读:
    PAT——1069. 微博转发抽奖
    PAT——1068. 万绿丛中一点红
    PAT——1066. 图像过滤
    PAT——1065. 单身狗
    PAT——1064. 朋友数
    PAT——1063. 计算谱半径
    PAT——1062. 最简分数
    PAT——1061. 判断题
    PAT——1060. 爱丁顿数
    PAT——1059. C语言竞赛
  • 原文地址:https://www.cnblogs.com/mona524/p/7739276.html
Copyright © 2020-2023  润新知