Django中的 forms 模块

1、Django中的 forms 模块

  • 1、forms 模块的作用
    • 通过 forms 模块,允许将表单控件与python文件相结合
  • 2、使用 forms 模块
    • ①创建 forms.py 文件
    • ②导入 forms 模块
    • ③创建class,一个class对应一个表单,所有class需要继承自forms.Form
    • ④在class中创建属性,一个属性对应一个表单控件
    • 参考文档(Forms)
    • 在Django中,HttpRequest被演变成了request封装到视图(views)处理函数中的作为参数,该参数,在调用视图处理函数时自动传参
    # forms.py
    from django import forms
    
    TOPIC_CHOICES = (
        # <option value='level1' >1星</option>
        ('level1', "1星"),
        ('level2', "2星"),
        ('level3', "3星"),
        ('level4', "4星"),
        ('level5', "5星"),
    )
    
    class RemarkForm(forms.Form):
        # 创建subject 属性,对应生产一个文本框
        # label:控件提示的文本
        # initial: 控件的初始值
        subject = forms.CharField(label='标题', initial='初始数据')
    
        # 创建email属性,对应生产一个邮件框
        email = forms.EmailField(label='邮件')
    
        # 创建一个多行文本域
        # widget 取值为 forms.Textarea 则变成多行文本域
        message = forms.CharField(label='内容', widget=forms.Textarea)
    
        # 创建一个下拉列表
        # choices:指定下拉列表的选项,取值为一个元组
        topic = forms.ChoiceField(label='评价', choices=TOPIC_CHOICES)
    
        # 创建复选框
        save = forms.BooleanField(label='是否保存')
    
    # views.py
    from django.shortcuts import render
    from django.http import HttpResponse
    
    from .forms import *
    
    def remark_views(request):
        form = RemarkForm()
        return render(request, 'remark.html', locals())
    
    # urls.py
    from django.conf.urls import url
    from django.contrib import admin
    
    from .views import *
    
    urlpatterns = [
        url(r'^remark/$', remark_views, name='remark'),
    ]
    
  • 3、在模板中解析form表单
    • ①需要手动添加<form> </form>
    • ②需要手动自定义提交按钮<p><input type=“submit” value=“提交”></p>
    • ③处理方法可选手动解析和自动解析
    {% load static %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="{% url 'remark' %}" method="post">
        {% csrf_token %}
        <!--手动解析生成表单控件-->
        {% for field in form %}
            <p>{{ field.label }}:{{ field }}</p>
        {% endfor %}
        <p><input type="submit" value="提交"></p>
        </form>
    
    	<form action="{% url 'remark' %}" method="post">
    	{% csrf_token %}
    	<!--自动解析生成表单控件-->
        	{{ form.as_p }}  
    	</form>
    	<!--{{ form.as_p }}中p表示p标签-->
    	<!--{{ form.as_ul }}中ul表示ul标签,需要自定义ul-->
    	<!--{{ form.as_table }}中table表示table标签,需要自定义table-->
    </body>
    </html>
    
  • 4、在html中提交的扁担内容也可以传递给forms.Form
    • ① 将post中的数据放在EntryForm中
    • ② 判断当前数据是否通过验证,此步骤必须验证
    • ③ 获取到提交的数据,并封装到一个字典中
    • ④ 获取到提交的表单控件数据
    # views.py
    from django.shortcuts import render
    from django.http import HttpResponse
    
    from .forms import *
    from .modles import *
    
    def remark_views(request):
        if request.method == 'GET':
            form = RemarkForm()
            return render(request, 'remark.html', locals())
        else:
            # 接收提交的数据
            form = RemarkForm(request.POST) # 将post中的数据放在RemarkForm中
            if form.is_valid():   # 判断当前数据是否通过验证
                data = form.cleaned_data  # 获取到提交的数据,并封装到data中
                # 获取到提交的表单控件数据。subject、email等是RemarkForm中的属性名
                subject = data['subject']
                email = data['email']
                message = data['message']
                topic = data['topic']
                Entry(**data).save()  # 保存到数据库
            return HttpResponse(subject + email + message + topic)
    
  • 5、forms 模块的高级处理
    • 将Models 和 Forms 结合到一起使用,通过Models自动生成表单
      • ① 创建 class EntryForm,并继承自forms.ModelForm
      • ② 创建内部类 Meta ,并定义相关信息
        • model:指定相关联的models
        • fields :
          • 指定一个列表, 声明允许生成表单控件的属性
          • ‘_ all _’,表示全部属性允许被生成表单控件
        • labels:取值为字典,{‘属性名’:‘显示文本’}
    # models.py
    from django.db import models
    
    class User(models.Model):
        uname = models.CharField(max_length=30, verbose_name='用户名')
        upwd = models.CharField(max_length=50, verbose_name='用户密码')
        uage = models.IntegerField(verbose_name='用户年龄')
        uemail = models.EmailField(verbose_name='用户邮箱')
    
    # forms.py
    from django import forms
    from .models import *
    
    class UserForm(forms.ModelForm):
        class Meta:
            model = User # 表单控件关联到 User 的 Models类上
            fields = '__all__' # User 中的所有字段均生成表单控件
            # fields = ['uname', 'uage'] 部分字段生成表单控件
            labels = {
                'uname':'用户名',  # uname= forms.CharField(label='用户名')
                'upwd':'用户密码',
                'uage':'用户年龄',
                'uemail':'用户邮箱',
            }
    
  • 6、forms 模块的小部件
    • ① 什么是小部件
      • 生成到网页上的控件类型
    • ② 常用的小部件
      • TextInput:<input type=“text” >
      • NumberInput:<input type=“number” >
      • EmailInput:<input type=“email” >
      • URLInput:<input type=“url” >
      • PasswordInput:<input type=“password” >
      • HiddenInput:<input type=“hidden” >
      • CheckboxInput:<input type=“checkbox” >
      • Textarea:<textarea></textarea>
      • Select:<select></select>
    • ③ 小部件的使用:
      • 继承自forms.Form
      • 继承自forms.ModelForm
    # forms.py
    from django import forms
    from .models import *
    
    # 继承自forms.Form 使用小部件方式
    class RemarkForm(forms.Form):
        # 创建一个多行文本域
        # widget 取值为 forms.Textarea 则变成多行文本域
        message = forms.CharField(
            label='内容',
            widget=forms.Textarea(
                attrs={
                    'class':'form-control',  # 在此控件中增加 class 等属性
                    'placeholder': '请输入内容'
    	        }
    	    )
    	)
    
    # 继承自forms.ModelForm 使用小部件方式
    class UserForm(forms.ModelForm):
        class Meta:
            model = User # 表单控件关联到 User 的 Models类上
            fields = '__all__' # User 中的所有字段均生成表单控件
            labels = {
                'uname':'用户名',  # uname= forms.CharField(label='用户名')
                'upwd':'用户密码',
                'uage':'用户年龄',
                'uemail':'用户邮箱',
            }
            widgets = {
                'uname': forms.TextInput(attrs={
                    'class': 'form-control',    # 在此控件中增加 class 等属性
                    'palceholder': '请输入用户名'
                }),
                'upwd': forms.PasswordInput(),
                'uage': forms.NumberInput(),
                'uemail': forms.EmailInput(),
            }
    
发布了75 篇原创文章 · 获赞 87 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43883022/article/details/102598929