整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「Django框架」-Form表单组件

章来源于公众号【Python野路子】


HTML表单是网站交互性的经典方式,本章将记录如何用Django对用户提交的表单数据进行处理。

HTML中的表单

站在前端角度,form表单HTML中用于提交数据给服务器的一个标签,所有的表单元素(input/textarea/button...)都要放在form标签当中,还有以下参数:

  • formmethod参数用于设置表单的提交方式,默认使用GET
  • action用于设置表单的提交url,如果不写或者保持空字符串,那么将使用当前的URL,建议尽量指定一个url,因为有些浏览器可能兼容问题,不填是不能获取到对应的action的。

Django中的表单

Django中的表单不是html中的那个表单,这里是指Django中的组件名叫表单,主要做以下2件事:

1)表单验证数据的合法性。

2)通渲染表单模板;

Form

Form类在from django import forms中,使用时需要定义一个Form的子类,相当于将请求的表单数据封装到一个特殊的类中,并自动完成一些数据的验证工作。

Form基本使用

1)先在某个应用app下,新建一个forms.py的文件(类似前面学过的views.pyurls.py在对应app应用下)。

2)在里面定义一个表单类,继承自django.forms.Form

 from django import forms 

3)在表单类中,创建字段与模型类类似,但是没有null=True(是否接受空值NULL,默认值False)或者blank=True(是否接受空白内容,默认为False)等这几种参数了,有的参数是required=True/False(请求能否为空,True不能为空,默认为True)。

from django import forms

class RegisterForm(forms.Form):
    # label属性是form表单中特有的属性,代表这个字段的描述,这个属性类似于模型类中的verbose_name属性
    username = forms.CharField(label=u'用户名', max_length=20, min_length=3)
    # 存储到数据库的密码,是一个加密后的字符串,但是这里是通过前端传输过来的,并没进行加密
    password = forms.CharField(label=u'密码', max_length=20, min_length=8)

4)表单生成HTML表单元素。

# views.py

class RegisterView(View):
    def get(self, request):
        # 如果需要使用django表单渲染html页面
        # 实例化该表单模型,传递给前端
        form = RegisterForm()
        return render(request, 'register_form.html', {'form': form})

    def post(self, request):
        # 如果不使用django表单,需要一个一个的值取出来,并且需要自己写对应的验证
        username = request.POST.get('username')
        password = request.POST.get('password')
        return render(request, 'register_form.html', locals())
<!-- register_form.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    {% if username %}
        提交的post数据:
        {{ username }}
        {{ password }}
    {% else %}
        <form action = "{% url "user:register" %}" method="post">
            {% csrf_token %}
            {{ form }}  <!--会自动识别表单属性的 -->
            <input type="submit" vlaue='注册'>
        </form>
    {% endif %}
</body>
</html>




注意:使用DjangoForm类生成的表单,不包含formsubmit按钮两个标签,需要手动添加。

一般用于生成HTML表单元素很少使用,尤其在现在前后分离趋势下,这个功能很鸡肋,把前端该做的事情放到后台来实现,增加了代码的耦合性,也增加了服务器的压力。

我们一般使用forms组件的校验功能,比如账号长度必须6~12位,密码长度必须为8~20位,且必须含大小写字母,我们可以一个个获取前端传过来的字段进行一个个校验,如果字段比较多,如果一个个单独校验,那比较繁琐,那我们可以使用django提供的forms组件,我们先来看个简单的。

# forms.py
'''
forms.py的作用
它是专门编写你的forms配置的模型
forms.py本身命名没有要求,你可以为任意名称, 但是我们一般约定它叫forms,代表这个文件是专门处理该APP下处理表单组件的
'''
from django import forms

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=20, min_length=3)
    password = forms.CharField(max_length=20, min_length=8)

# views.py

class RegisterView(View):
    def get(self, request):
        # 如果需要使用django表单渲染html页面
        # 实例化该表单模型,传递给前端
        form = RegisterForm()
        return render(request, 'register_form.html', {'form': form})

    def post(self, request):
        # 满足Form里面
        form = RegisterForm({'username': 'admin', 'password': '12345678'})
        print(form.is_valid())  # True
        print(form.cleaned_data)  # {'username': 'admin', 'password': '12345678'},输出全部校验正确的字段
        print(form.errors)

        # 其中一个不满足,例如密码长度少于8
        form = RegisterForm({'username': 'admin', 'password': '12345'})
        print(form.is_valid())  # False
        print(form.cleaned_data)  #  {'username': 'admin'}, 输出校验正确的字段
        print(form.errors)
        '''
        <ul class="errorlist">
            <li>password
                <ul class="errorlist">
                    <li>Ensure this value has at least 8 characters (it has 5).</li>
                </ul>
            </li>
        </ul>
        '''
        print(type(form.errors))  # <class 'django.forms.utils.ErrorDict'>
        print(form['password'].errors)
        # <ul class="errorlist"><li>Ensure this value has at least 8 characters (it has 5).</li></ul>
        print(form.errors.get('password'))
        # <ul class="errorlist"><li>Ensure this value has at least 8 characters (it has 5).</li></ul>
        print(form.errors.get_json_data())
        # {'password': [{'message': 'Ensure this value has at least 8 characters (it has 5).', 'code': 'min_length'}]}


        # 比Form少一个字段
        form = RegisterForm({'username': 'admin'})
        print(form.is_valid())  # False
        print(form.cleaned_data)  # {'username': 'admin'}
        print(form.errors)
        '''
        <ul class="errorlist">
            <li>password
                <ul class="errorlist">
                    <li>This field is required.</li>
                </ul>
            </li>
        </ul>        
        '''
        print(form.errors.get('password'))
        # <ul class="errorlist"><li>This field is required.</li></ul>
        
        print(form.errors.get_json_data())
        # {'password': [{'message': 'This field is required.', 'code': 'required'}]}


        # 比Form多一个字段,例如多个age
        form = RegisterForm({'username': 'admin', 'password': '12345678', 'age': 18})
        print(form.is_valid())  # True
        print(form.cleaned_data)  # {'username': 'admin', 'password': '12345678'}, 比Form多的字段不输出
        print(form.errors)

        return render(request, 'register_form.html', locals())

我们这里先传几个固定的参数来进行测试,通过上面测试,我们可以总结下。

1)使用is_valid()方法可以验证用户提交的数据是否合法,这个方法会返回一个bool值,合法则返回True,否则返回False。其中在实例化一个form对象时,传的参数必须与Form里面定义的字段:

  • 传的字段名一样;
  • 字段值必须满足Form里面的校验规则;
  • 传的参数个数 等于或大于 Form定义的个数。

2)cleaned_data()获取满足Form校验规则的字段, 使用cleaned_data必须执行完is_valid()方法。

3)如果表单校验没有通过,form对象则会产生一个errors属性,这个属性包括所有的验证错误信息。我们可以获取错误信息传递给前端。

  • form.errors:这个属性获取的错误信息是一个包含html标签的错误信息。
  • 通过form['属性名'].errosform.errors.get('属性名')访问对应的错误。
  • 通过form.errors.get_json_data()form['属性名'].erros.get_json_data()可以将错误消息转换成JSON数据。
  • 默认的错误信息是英文不够人性化,我们可以通过在Field中添加一个error_messagesdict类型的参数,然后根据属性名设置对应的message,例如以下代码:password = forms.CharField(label=u'密码', max_length=20, min_length=8, error_messages={'required':u'密码不能为空'})

必须要执行完is_valid函数,否则errors是不会包含错误。

常用Field字段

在表单中,创建字段跟模型是一模一样的,但是没有null=True(是否接受空值NULL,默认值False)或者blank=True(是否接受空白内容,默认为False)等这几种参数了,有的参数是required=True/False(请求能否为空,True不能为空,默认为True)。

使用Field可以是对数据验证的第一步。你期望这个提交上来的数据是什么类型,那么就使用什么类型的Field

CharField

用来接收文本。参数:

  • max_length:这个字段值的最大长度。
  • min_length:这个字段值的最小长度。
  • required:这个字段是否是必须的。默认是True,必须的。
  • error_messages:字段验证失败时给出的错误提示信息,需要传入一个字典,字典中需要指定对应验证条件的错误提示信息,如error_messages={'max_length': '最多只能有100个字符!'}表示指定文本最大长度不满足时给出提示信息。

EmailField

用来接收邮件,会自动验证邮箱格式是否合法。错误信息的key:requiredinvalid

FloatField

用来接收浮点类型,并且如果验证通过后,会将这个字段的值转换为浮点类型。参数:

  • max_value:最大的值。
  • min_value:最小的值。

错误信息的key:requiredinvalidmax_valuemin_value

IntegerField

用来接收整形,并且验证通过后,会将这个字段的值转换为整形。参数:

  • max_value:最大的值。
  • min_value:最小的值。

错误信息的key:requiredinvalidmax_valuemin_value

URLField

用来接收url格式的字符串。错误信息的key:requiredinvalid

FileField

用来接收文件,allow_empty_file=False是否允许空文件。

ImageField

接收图片,注意需要PIL模块,pip3 install Pillow,以上2个字典使用时,需要注意2点:

  • form表单中enctype="multipart/form-data"
  • view函数中my_form= MyForm(request.POST, request.FILES)

验证器

Form类中的各个Field字段其实都有一些基本的验证器,如果表单中的某个字段想要额外添加一些验证功能,可以指定validators参数给字段添加一些验证器,或者给这个字段定义一个额外的形如clean_[字段名]自定义验证方法。

内置验证器

内置验证器通过字段的validators参数指定对应的验证器列表即可,Django内置的验证器都在django.core.validators中,常用的内置验证器:

  • MaxValueValidator:最大值。
  • MinValueValidator:最小值。
  • MaxLengthValidator:最大长度。
  • MinLengthValidator:最小长度。
  • EmailValidator:是否为邮箱格式。
  • URLValidator:是否为url格式。
  • RegexValidator:是否符合正则表达式,使用时传入一个正则表达式即可。
  • FileExtensionValidator:验证文件名后缀是否符合要求,使用时传入一个文件名后缀的列表,如['txt', 'csv'],表示只允许上传这些类型的文件。

自定义验证

系统自带表单校验规则,有时无法满足我们的需求,比如在注册的表单验证中,我们需要验证用户是否已经被注册过了,那么这个时候就需要去数据库查询判断才知道,这个时候我们可以对某个字段,进行自定义的验证。

需要针对某个字段进行特殊验证时,可以在Form表单类中定义一个clean_[字段名]的方法,就会自动执行这个方法进行验证了,如果不符合要求,直接抛出异常即可,符合要求则返回对应的值。如果想要针对多个字段之间的验证,可以重写clean()方法,当所有字段的验证都通过后就会执行这个方法。

# form.py

from django import forms
from .models import Account

class RegisterForm(forms.Form):
    # label 属性是form表单中特有的属性,代表这个字段的描述,这个属性类似于模型类中的verbose_name属性
    username = forms.CharField(label=u'用户名', min_length=3, max_length=18,
                               error_messages={'required': u'用户名不能为空',
                                               'min_length': u'用户名不少于3位',
                                               'max_length': u'用户名不超过18位'
                                               })

    password = forms.CharField(label=u'密码', required=True, min_length=6, max_length=16,
                               error_messages={'required': u'密码不能为空', 'min_length': u'密码不少于6位',
                                               'max_length': u'密码不超过16位'})
    confirm_pwd = forms.CharField(label=u'确认密码', min_length=6, max_length=16,
                                  error_messages={'required': u'确认密码不能为空', 'min_length': u'密码不少于6位',
                                               'max_length': u'密码不超过16位'})
    # 可以不填
    email = forms.EmailField(label=u'邮箱', required=False)  # required 请求能否为空,True不能为空,默认为True

    # 表单自定义错误消息:重写方法clean_field(field是一个属性名),可以自定义针对某一个field的验证机制,一个属性一个对应方法
    # clean() 或者 clean_xxx() 会在执行 form.is_valid() 的过程中被调用
    def clean_username(self):
        # 当字段的基本验证通过后,会将数据存储在cleaned_data中
        username = self.cleaned_data['username']
        if Account.objects.filter(username=username).exists():
            # 如果这里判断有多个错误存在,则使用add_error方法。
            self.add_error('username', '该用户名已使用,请重新选择!')
            # 如果只是单个错误,使用ValidationError,否则这里raise抛出去了,后面就不能执行了
            #raise forms.ValidationError('用户已存在')

        # 敏感词汇
        if username.find('mmp') >= 0:
            self.add_error('username', '存在敏感字符')
            
  # 需要返回处理后的值
        return username

    def clean_confirm_pwd(self):  #不能用clean_password,因为加载这个时候,confirm_pwd还没加载出来,是没有值的。
        pwd = self.cleaned_data['password']
        confirm_pwd = self.cleaned_data['confirm_pwd']

        if pwd != confirm_pwd:
            raise forms.ValidationError('两次密码不一致', code='')

        return pwd
    
    def clean(self):
        # 执行这个方法时表示所有字段都已验证成功,当然,需要先调用父类的clean()方法
        cleaned_data = super().clean()
        # 当字段的基本验证通过后,会将数据存储在cleaned_data中
        # 获取需要验证的字段
        
        ...
        # 需要返回处理后的值
        return cleaned_data      

    def get_error_dict(self):
        # 提取错误信息
        if hasattr(self, 'errors'): #hasattr() 函数用于判断对象是否包含对应的属性。
            errors = self.errors.get_json_data()
            print(type(errors)) # <class 'dict'>
            print(errors)
            # {'username': [{'message': '用户名不能为空', 'code': 'required'}],
            # 'password': [{'message': '密码不能为空', 'code': 'required'}],
            # 'confirm_pwd': [{'message': '确认密码不能为空', 'code': 'required'}]}

            err_msg_dict = {}
            for key, message in errors.items():
                print(key, message) # username [{'message': '用户名不能为空', 'code': 'required'}]
                msg_list = []
                for msg in message:
                    print(msg) # {'message': '用户名不能为空', 'code': 'required'}
                    msg_list.append(msg['message'])

                err_msg_dict[key] = msg_list

            print(err_msg_dict)  # {'username': ['用户名不能为空'], 'password': ['密码不能为空'], 'confirm_pwd': ['确认密码不能为空']}

            return err_msg_dict

        return None


    def get_error_str(self):
        # 提取错误信息
        if hasattr(self, 'errors'): #hasattr() 函数用于判断对象是否包含对应的属性。
            errors = self.errors.get_json_data().values()  # 获取字典值部分
            print(errors)
            #dict_values([[{'message': '用户名不能为空', 'code': 'required'}],
            # [{'message': '密码不能为空', 'code': 'required'}], [{'message': '确认密码不能为空', 'code': 'required'}]])

            err_msg_list = []
            for itme in errors:
                print(itme) # [{'message': '用户名不能为空', 'code': 'required'}]

                err_msg_list.append(itme[0].get('message'))

            print(err_msg_list) # ['用户名不能为空', '密码不能为空', '确认密码不能为空']

            err_msg_str = ';'.join(err_msg_list)  # 将错误信息通过;拼接成字符串

            print(err_msg_str)  # 用户名不能为空;密码不能为空;确认密码不能为空

            return err_msg_str

        return None

视图views.py

class RegisterView(View):
    def get(self, request):
        # 如果需要使用django表单渲染html页面
        # 实例化该表单模型,传递给前端
        return render(request, 'register_form.html')

    def post(self, request):
        print(request.POST) #<QueryDict: {'username': ['admin'], 'password': ['6666'], 'confirm_pwd': ['222'], 'email': ['']}>

        register_form = RegisterForm(request.POST)

        if register_form.is_valid():
            # 使用cleaned_data 必须执行完is_valid 且返回为True才能获取数据,保存用户提交上来的数据
            print(register_form.cleaned_data)
            username = register_form.cleaned_data['username']
            password = register_form.cleaned_data['password']

            # 利用字典解包方式
            params = {'username': username, 'password': password}
            Account.objects.create(**params)

            return HttpResponse('注册成功')

        else:
            print(register_form.errors)
            # <ul class="errorlist"><li>username<ul class="errorlist"><li>用户名不能为空</li></ul></li></ul>
            print(register_form.errors.get_json_data())
            # {'username': [{'message': '用户名不能为空', 'code': 'required'}]}

            print(register_form.errors.get('username'))  # <ul class="errorlist"><li>用户名不能为空</li></ul>

            print(register_form.errors.get('username').get_json_data()) # [{'message': '用户名不能为空', 'code': 'required'}]

            err_msg_dict = register_form.get_error_dict()
            # {'username': ['用户名不能为空'], 'password': ['密码不能为空'], 'confirm_pwd': ['确认密码不能为空']}

            return render(request, 'register_form.html', err_msg_dict)

模板register_form.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="{% url "user:register" %}" method="post">
    用户名:<input type="text" name="username"><span>{{ username.0 }}</span>
    密  码:<input type="password" name="password"><span>{{ password.0 }}</span>
    确认密码:<input type="password" name="confirm_pwd"><span>{{ confirm_pwd.0 }}</span>
    邮  箱:<input type="email" name="email">

    <input type="submit" vlaue='注册'>
</form>
</body>
</html>

自定义错误信息,可以通过在定义表单类是设置相关属性,校验不通过则会报默认错误。我们可以通过设置error_messages字典来设置对应message。也可以自定义错误信息。

不管那种必须要执行完is_valid函数,否则执行相关errors是不会包含错误,form类的运行顺序是initcleanvalidtesave,如果遇到类似错误,比如说不能为空,最大最小长度时,在error_messages写了错误信息,也自定义了表单错误信息,则required=True时调用error_message,否则自定义的。

ModelForm

通过上面我们发现,Form表单中的字段与模型中的字段基本是一模一样的,表单中需要验证的数据,也就是模型中需要保存的,我们可以将模型中的字段与表单中的字段进行绑定,例如上面RegisterForm改成继承forms.ModelForm

# models.py
class Account(models.Model):
    username = models.CharField(max_length=16)
    password = models.CharField(max_length=20)

    class Meta:
        db_table = 'tb_account'

    def __str__(self):
        return self.username
    
# forms.py
class RegisterForm(forms.ModelForm):
    """
      1.补充 Model 没有的 Field 到表单,例如这里的confirm_pwd
      2.覆盖 Model 中的 Field 定义
    """
    confirm_pwd = forms.CharField(label=u'确认密码', min_length=6, max_length=16,
                                  error_messages={'required': u'确认密码不能为空',                                   'min_length': u'密码不少于6位', 'max_length': u'密码不超过16位'})

    class Meta:
        model = Account  # 对应model中的类
        fields = '__all__'  # 说明要关联类中的哪些字段,默认__all__关联所有字段,如果不需要全部
        # exclude = ['avatar']  # 排除字段
        error_messages = {  # 自定义错误信息
            'username': {
                'max_length': '用户名长度不超过16位',
                'required': "用户名不能为空",
            },
            'password': {
                'max_length': '用户名长度不超过16位',
                'required': "用户名不能为空",
            }
        }

    def clean_confirm_pwd(self): 
        pwd = self.cleaned_data['password']
        confirm_pwd = self.cleaned_data['confirm_pwd']

        if pwd != confirm_pwd:
            raise forms.ValidationError('两次密码不一致', code='')

        return pwd

    
# views.py
from .forms import RegisterForm

from hashlib import md5

class RegisterView(View):
    def get(self, request):
        # 如果需要使用django表单渲染html页面
        # 实例化该表单模型,传递给前端
        return render(request, 'register_form.html')

    def post(self, request):
        print(request.POST)

        register_form = RegisterForm(request.POST)

        if register_form.is_valid():
            # 使用cleaned_data 必须执行完is_valid 且返回为True才能获取数据,保存用户提交上来的数据
            print(register_form.cleaned_data)
            # {'username': 'admin666', 'password': '1q2w3e4r', 'confirm_pwd': '1q2w3e4r'}

            register_form.save()  # 这里save即使多了个confirm_pwd没关系,是按照model字段来的。

            return HttpResponse('注册成功')

        else:
            print(register_form.errors.get_json_data())
            #{'username': [{'message': '用户名不能为空', 'code': 'required'}],
            # 'password': [{'message': '用户名不能为空', 'code': 'required'}],
            # 'confirm_pwd': [{'message': '确认密码不能为空', 'code': 'required'}]}

            print(register_form.errors.get('username').get_json_data())  # [{'message': '用户名不能为空', 'code': 'required'}]

            return render(request, 'register_form.html')

RegisterForm是继承自forms.ModelForm,然后在表单中定义了一个Meta类,在Meta类中指定了model=Account,以及fields="__all__",这样就可以将Account模型中所有的字段都复制过来,进行验证。如果只想针对其中几个字段进行验证,那么可以给fields指定一个列表,将需要的字段写进去。

如果要验证的字段比较多,只是除了少数几个字段不需要验证,那么可以使用exclude来代替fields

与普通的Form表单验证类型类似,ModelForm表单的验证在调用is_valid()或访问errors属性时隐式调用。

验证时,可以在ORM模型的字段定义中指定validators参数,添加额外的验证器即可。

自定义错误,因为字段都不是在表单中定义的,而是在模型中定义的,因此一些错误消息无法在字段中定义。那么这时候可以在Meta类中,定义error_messages,然后把相应的错误消息写到里面去。

自定义校验规则与Form表单一样。

save保存,ModelForm还有save方法,可以在验证完成后直接调用save方法,就可以将这个数据保存到数据库中了。这个方法必须要在clean没有问题后才能使用,如果在clean之前使用,会抛出异常。另外,我们在调用save方法的时候,如果传入一个commit=False,那么只会生成这个模型的对象,而不会把这个对象真正的插入到数据库中。比如表单上验证的字段没有包含模型中所有的字段,这时候就可以先创建对象,再根据填充其他字段,把所有字段的值都补充完成后,再保存到数据库中,例如:

form = MyForm(request.POST)
if form.is_valid():
    article = form.save(commit=False)
    article.category = 'Python'
    article.save()
    return HttpResponse('succes')
else:
    print(form.get_errors())
    return HttpResponse('fail')

并且即使form的数据比model模型字段多也没关系。

ModelForm的子类可以接受现有的模型实例作为关键字参数instance;如果提供此功能,则save()将更新该实例。如果没有提供,save() 将创建模型的一个新实例。

# 修改表数据是,记得把instance信息也传进去,不然是新建数据,而不是对某行数据进行修改。
article_form = ArticleAddForm(dict_data, instance=article)  # 指定给谁做修改
if article_form.is_valid():
    article_form.save()
    return json_status.result(message='文章更新成功')


#Django#

文章来源于公众号【Python野路子】

、HTML标签:表单标签

1.1 表单概念:用于采集用户输入的数据的。用于和服务器进行交互。

1.2 语法:

form:用于定义表单的,可以定义一个范围,范围代表采集用户数据的范围

属性:

action:指定提交数据的URL

method:指定提交方式

method分类:一共7种,2种比较常用

get:

1. 请求参数会在地址栏中显示。会封装到请求行中(HTTP协议后讲解)。

2. 请求参数大小是有限制的。

3. 不太安全。

post:

1. 请求参数不会再地址栏中显示。会封装在请求体中(HTTP协议后讲解)

2. 请求参数的大小没有限制。

3. 较为安全。

注意:表单项中的数据要想被提交:必须指定其name属性


二、表单项标签:

2.1 input:可以通过type属性值,改变元素展示的样式

2.1.1 type属性:

text:文本输入框,默认值

placeholder:指定输入框的提示信息,当输入框的内容发生变化,会自动清空提示信息

password:密码输入框

radio:单选框

注意:

1. 要想让多个单选框实现单选的效果,则多个单选框的name属性值必须一样。

2. 一般会给每一个单选框提供value属性,指定其被选中后提交的值

3. checked属性,可以指定默认值

checkbox:复选框

注意:

1. 一般会给每一个单选框提供value属性,指定其被选中后提交的值

2. checked属性,可以指定默认值

file:文件选择框

hidden:隐藏域,用于提交一些信息。

按钮:

submit:提交按钮。可以提交表单

button:普通按钮

image:图片提交按钮

src属性指定图片的路径

label:指定输入项的文字描述信息

注意:

label的for属性一般会和 input 的id属性值对应。如果对应了,则点击label区域,会让input输入框获取焦点。

select: 下拉列表,子元素option,指定列表项

textarea:文本域,cols指定列数,每一行有多少个字符,rows默认多少行。


三、CSS:页面美化和布局控制

3.1 概念: Cascading Style Sheets 层叠样式表

层叠:多个样式可以作用在同一个html的元素上,同时生效


3.2 好处:

1. 功能强大

2. 将内容展示和样式控制分离

3. 降低耦合度。解耦

4. 让分工协作更容易

5. 提高开发效率

3.3 CSS的使用:CSS与html结合方式

3.3.1 内联样式:在标签内使用style属性指定css代码

如:<div style="color:red;">hello css</div>


3.3.2 内部样式:在head标签内,定义style标签,style标签的标签体内容就是css代码

如:

<style>

div{

color:blue;

}

</style>

<div>hello css</div>


3.3.3 外部样式

1. 定义css资源文件。

2. 在head标签内,定义link标签,引入外部的资源文件

如:

a.css文件:

div{

color:green;

}

html文件:

<link rel="stylesheet" href="css/a.css">

<div>hello css</div>


注意:

1,2,3种方式 css作用范围越来越大

1方式不常用,后期常用2,3


3.4 css语法:

3.4.1 格式:

选择器 {

属性名1:属性值1;

属性名2:属性值2;

...

}

* 选择器:筛选具有相似特征的元素

* 注意:

* 每一对属性需要使用;隔开,最后一对属性可以不加;


3.5 css选择器:筛选具有相似特征的元素

3.5.1 分类:

1. 基础选择器:

1. id选择器:选择具体的id属性值的元素.建议在一个html页面中id值唯一

* 语法:#id属性值{}

2. 元素选择器:选择具有相同标签名称的元素

* 语法: 标签名称{}

* 注意:id选择器优先级高于元素选择器

3. 类选择器:选择具有相同的class属性值的元素。

* 语法:.class属性值{}

* 注意:类选择器选择器优先级高于元素选择器


2. 扩展选择器:

1. 选择所有元素:

* 语法: *{}

2. 并集选择器:

* 选择器1,选择器2{}

3. 子选择器:筛选选择器1元素下的选择器2元素

* 语法: 选择器1 选择器2{}

4. 父选择器:筛选选择器2的父元素选择器1

* 语法: 选择器1 > 选择器2{}

5. 属性选择器:选择元素名称,属性名=属性值的元素

* 语法: 元素名称[属性名="属性值"]{}

6. 伪类选择器:选择一些元素具有的状态

* 语法: 元素:状态{}

* 如: <a>

* 状态:

* link:初始化的状态

* visited:被访问过的状态

* active:正在访问状态

* hover:鼠标悬浮状态

3.6 css属性:

1. 字体、文本

* font-size:字体大小

* color:文本颜色

* text-align:对其方式

* line-height:行高

2. 背景

* background:

3. 边框

* border:设置边框,符合属性

4. 尺寸

* width:宽度

* height:高度

5. 盒子模型:控制布局

* margin:外边距

* padding:内边距

* 默认情况下内边距会影响整个盒子的大小

* box-sizing: border-box; 设置盒子的属性,让width和height就是最终盒子的大小

* float:浮动

* left

* right

单的作用就是采集用户填写的信息,将其发往服务器做相应的处理

表单的元素必须写在form标签中,一个form就是一个表单,表单中最重要的元素是input

input元素有一个type属性,type的可选值有:1)button(普通按钮)2checkbox(复选框)3text(单行文本框)4password(密码框)5radio(单选按钮)6image(图片按钮)7file(文件选择框)8hidden(隐藏字段)9<input type="file" />submit(提交按钮)10reset(重置按钮)

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    <title>表单元素</title>
</head>
<body>
    <form action="http://www.bd.com/register.aspx" method="post">
        用 户 名:<input type="text" value="张三" size="8" name="txtName" /><br /><br />
        用户密码:<input type="password" size="8" /><br /><br />
        用户性别:<input type="radio" name="rdGender" value="1" />男<input type="radio" name="rdGender"
            value="0" />女<br /><br />
        兴趣爱好:<input type="checkbox" value="0" checked="checked" />乒乓球<input type="checkbox" value="1" />篮球<input
            type="checkbox" value="2" />排球<br /><br />
        省市选择:省:<select>
            <option value="0">北京</option>
            <option selected="selected" value="1">河南</option>
            <option value="2">河北</option>
        </select>
        市:<select>
            <option value="0">密云</option>
            <option selected="selected" value="1">郑州</option>
            <option value="2">石家庄</option>
        </select><br /><br />
        上传文件:<input type="file" /><br/><br/>
        <textarea cols="50" rows="10" readonly="readonly">
				北京百度网讯科技有限公司
				统一社会信用代码/注册号:91110000802100433B
				注册资本:1342128万元
				法定代表人:梁志祥
				成立日期:2001-06-05
				营业期限:2001-06-05 至 长期
				企业类型:有限责任公司(自然人投资或控股)
				注册地址:北京市海淀区上地十街10号百度大厦2层
				经营范围:技术转让、技术咨询、技术服务、技术培训、技术推广;设计、开发、销售计算机软件;经济信息咨询;利用www.baidu.com、www.hao123.com(www.hao222.net、www.hao222.com)网站发布广告;设计、制作、代理、发布广告;货物进出口、技术进出口、代理进出口;医疗软件技术开发;委托生产电子产品、玩具、照相器材;销售家用电器、机械设备、五金交电(不含电动自行车)、电子产品、文化用品、照相器材、计算机、软件及辅助设备、化妆品、卫生用品、体育用品、纺织品、服装、鞋帽、日用品、家具、首饰、避孕器具、工艺品、钟表、眼镜、玩具、汽车及摩托车配件、仪器仪表、塑料制品、花、草及观赏植物、建筑材料、通讯设备、汽车电子产品、器件和元件、自行开发后的产品;预防保健咨询;公园门票、文艺演出、体育赛事、展览会票务代理;翻译服务;通讯设备和电子产品的技术开发;计算机系统服务;车联网技术开发;汽车电子产品设计、研发、制造(北京市中心城区除外);演出经纪;人才中介服;经营电信业务;利用信息网络经营音乐娱乐产品、演出剧(节)目、动漫产品、游戏产品(含网络游戏虚拟货币发行)、表演、网络游戏技法展示或解说(网络文化经营许可证有效期至2020年04月17日);因特网信息服务业务(除出版、教育、医疗保健以外的内容);图书、电子出版物、音像制品批发、零售、网上销售。(市场主体依法自主选择经营项目,开展经营活动;演出经纪、人才中介服务、利用信息网络经营音乐娱乐产品、演出剧(节)目、动漫产品、游戏产品(含网络游戏虚拟货币发行)、表演、网络游戏技法展示或解说、经营电信业务以及依法须经批准的项目,经相关部门批准后依批准的内容开展经营活动;不得从事国家和本市产业政策禁止和限制类项目的经营活动。)
			</textarea><br /><br />
        <input type="button" value="按钮" />
        <input type="submit" value="提交" />
        <input type="reset" value="重置" />
    </form>
</body>
</html>

还有一些次要的表单元素以后需要用到再说;关于浏览器兼容性自己测试不再截图

绝大多数表单元素必须有name与value属性,这样的表单元素才能将此元素的的value值传递给服务器;如果method属性值为get,点击submit这个按钮时在网址中就能看到填写的值

如果是radio(单选按钮)name属性值必须一样,这样此元素值就会只能选择其中一个

button:只是一个普通按钮,以后会通过JavaScript进行操作;submit:自动将填写在此网页表单元素的值发送给action指定的服务器相应的程序去处理;reset:将表单元素中填入的值还原为默认值

HTML表单