wkhzwmr

第八章表单与模型

django表单功能由Form类实现,主要分为两种
1.django.forms.Form
2.django.forms.ModelForm # 结合模型生成的数据表单

表单form标签中的action用于设置用户提交的表单数据应由哪个路由来接收和处理,若为空,则提交由当前的路由来接收和处理。否则则跳转到属性action所指向的路由地址
提交请求由method决定

网页表单的构成

    {% if v.errors %} <!--v为表单类的实例化-->
        <p>
            数据出错啦,错误信息:{{ v.errors }}
        </p>
    {% else %}
        <form action="" method="post">
        {% csrf_token %}
            <table>
                <!--将表单对象生成网页表单-->
                {{ v.as_table }} as_table <!--表单的表示纯用模板变量么-->
            </table>
            <input type="submit" value="提交">
        </form>
    {% endif %}

定义表单类,新建表单文件

from django import forms
from .models import *
class VocationForm(forms.Form):
    job = forms.CharField(max_length=20, label=\'职位\')
    title = forms.CharField(max_length=20, label=\'职称\')
    payment = forms.IntegerField(label=\'薪资\') # 难道IntegerField设置数字成可自增自减
    # 设置下拉框的值
    # 查询模型PersonInfo的数据
    value = PersonInfo.objects.values(\'name\') # 获取模型字段中的姓名
    # 将数据以为列表格式表示,列表元素为元组格式
    choices = [(i+1, v[\'name\']) for i, v in enumerate(value)]  # 这里又为什么只显示v[\'name\']
    # 表单字段设为ChoiceField类型,用生成下拉框
    person = forms.ChoiceField(choices=choices, label=\'姓名\') # choices=choices下拉框

表单类中定义的字段和html标签的比较

字段label转化为label标签, forms.CharField转化为
input type="text",job的命名转换为<input>控件的参数name,表单字段的max_length变为input控件的maxlength参数

# 表单类VocationForm的表单字段job
job = forms.CharField(max_length=20, label=\'职位\')
# html标签
<tr><th><label for="id_job">职位:</label></th><td><input type="text" name="job" maxlength="20" required id="id_job"></td></tr>

form源码分析

位置:django/forms/forms.py
表单的定义过程、表单的字段类型和表单字段的参数类型是表单的核心功能。

8.4视图里使用form

属性
prefix

prefix的作用就是为form命名,以区分多个表单,当然它实例化出来的html标签属性值是带有该参数
            # 您可以将多个 Django 表单放在一个<form>标签中。要给每个 Form自己的命名空间,请使用关键字参数:prefix

initial是表单实例化的初始化数据,他只适用于模型数据传递给表单,再由表单显示在网页上
post请求从表单中获取数据然后保存起来到数据库中,get请求是在url链接上的id获取,然后再模型中找到相应的数据,把数据库中的数据写到表单上

无论是统计字符串还是列表
xx.count(传入统计的参数)

filter查询字段为0的情况下,就无法使用update,需要使用get_or_create(d),除主键外,只要有一个数据不同就插入
create(
d),直接插入
8.5
表单类Form和模型实现数据交互最主要的问题是表单字段和模型字段的匹配性,如果将表单类Form改为ModelForm,就无需考虑字段匹配性的问题。
最好使用模型表单,表单类提取数据保存太难受了,我的报错问题:

ValueError: invalid literal for int() with base 10: \'\'

# commit=False就会生成一个数据库对象,然后可以对该数据库对象进行增删改除,然后将修改的数据保存到数据库中。
                # commit=True则直接将表单数据保存到数据库中

8.4,8.5表单的数据提取判断等逻辑都值得好好推敲


分割线

表单forms的属性和方法的源文件

django/forms/forms.py
主要类class BaseForm: (类中)
属性调用不加(),函数调用加()


表单字段类型和模型字段类型类似
源码位置django/forms/fields.py

模型表单的源码

djano/forms/models.py
主要类
class BaseModelForm:中
表单类ModelForm于模型之间没有直接的数据交互,模型表单与模型之间的数据交互是由函数modelform_factory实现的,该函数将自定义的模型表单与模型进行绑定,从而实现两者之间的数据交互。
函数modelform_factory与类ModelForm定义在同一个源码文件中,它定义了9个属性

model, form=ModelForm, fields=None, exclude=None,
                      formfield_callback=None, widgets=None, localized_fields=None,
                      labels=None, help_texts=None, error_messages=None,
                      field_classes=None

模型字段与表单字段的转换规则

视图里使用form

实现表单数据与模型交互

待补充的两个小结

分类:

技术点:

相关文章:

  • 2021-06-24
  • 2021-09-26
  • 2021-08-11
  • 2021-04-09
  • 2021-04-26
  • 2021-12-14
  • 2021-11-02
  • 2022-12-23
猜你喜欢
  • 2021-08-04
  • 2021-12-31
  • 2021-10-13
  • 2021-09-24
  • 2021-04-16
  • 2021-06-15
  • 2021-08-25
相关资源
相似解决方案