zoukankan      html  css  js  c++  java
  • 2019.03.24 表单类

    Form.form是一种内置的模板吧,它有自己设置的表单样式

    可以引用它,但我觉得还是自己写会比较好吧

    继承的是forms类了而不是models类了

    然后就是表单得验证,也是用了内置得数据库叫做  

    authenticate,login
    就是存admin密码的那个



    概述

    表单既可以在模板页面利用HTML编写,也可以使用Django提供的表单类编写。

    相关属性参考官网:https://docs.djangoproject.com/en/1.11/ref/forms/fields/

    实现熟悉的用户登录功能

    1. 创建新应用account

    2. settings中添加应用

    3. 配置URL

    4. 在account应用中创建forms.py文件

    5. 编写views函数

    6. 创建模板页面

    7. 启动服务器运行程序

    配置URL

    from django.conf.urls import url, include
    from django.contrib import admin

    urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^account/',include('account.urls',namespace='account',app_name='account'))
    ]


    #coding=utf-8


    from django.conf.urls import url
    import views

    urlpatterns=[
      url(r'^login/$',views.login_view,name='login')
    ]


    编写表单类(account.forms.LoginForm)


    #coding=utf-8


    from django import forms

    class LoginForm(forms.Form):
      username = forms.CharField(label=u'用户名')
      password = forms.CharField(label=u'密码',widget=forms.PasswordInput)


    配置视图函数


    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals

    from django.http import HttpResponse
    from django.shortcuts import render
    from .forms import LoginForm
    from django.contrib.auth import authenticate,login



    # Create your views here.
    def login_view(request):
      if request.method=='GET':
          login_form = LoginForm()
          return render(request,'login.html',{'login_form':login_form})

      else:
          login_form= LoginForm(request.POST)


          #校验表单数据是否合法
          if login_form.is_valid():
              #以字典形式返回合法数据
              cd = login_form.cleaned_data
              print cd
              #检验用户输入的用户和密码是否正确
              user = authenticate(username=cd['username'],password=cd['password'])
              print user

              if user:
                  #实现用户登录,将用户信息保存到session中完成登录操作
                  login(request,user)
                  return HttpResponse('success')

          return HttpResponse('failed')

    配置模板页面(login.html)


    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>

      <form action="" method="post">
          {% csrf_token %}
          {{ login_form.as_p }}

    {#       {% for field in login_form %}#}
    {#           {{ field.label_tag }}{{ field }}#}
    {#           {{ field.errors }}#}
    {#       {% endfor %}#}

          <input type="submit" value="登录"/>
      </form>
    </body>
    </html>

    应用场景

    1. 查询时表单类只需要继承于forms.Form。

    2. 增删改时表单类需要继承于forms.ModelForm。

    学生注册案例

    创建模型类

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals

    from django.db import models

    # Create your models here.

    class Clazz(models.Model):
      cno = models.AutoField(primary_key=True)
      cname = models.CharField(max_length=20)

      def __unicode__(self):
          return u'Clazz:%s'%self.cname
       

    class Stu(models.Model):
      sno = models.AutoField(primary_key=True)
      sname = models.CharField(max_length=30)
      clazz = models.ForeignKey(Clazz,on_delete=models.CASCADE)

      def __unicode__(self):
          return u'Stu:%s,%s'%(self.sno,self.sname)



    创建表单类(应用包下创建forms.py)


    #coding=utf-8


    from django import forms
    from .models import *

    class Add_Clazz(forms.ModelForm):
      class Meta:
          model = Clazz
          #元组形式
          fields = ('cname',)


    class Add_Stu(forms.ModelForm):
      class Meta:
          model = Stu
          fields = ('sname',)

    配置URL


    from django.conf.urls import url, include
    from django.contrib import admin

    urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^student/', include('student.urls')),
    ]


    #coding=utf-8


    from django.conf.urls import url
    import views

    urlpatterns=[
      url(r'^register/$',views.register)

    ]

    创建视图


    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals

    from django.http import HttpResponse
    from django.shortcuts import render
    from .forms import Add_Clazz,Add_Stu
    # Create your views here.

    def register(request):
      if request.method=='POST':
          ac = Add_Clazz(request.POST)
          astu = Add_Stu(request.POST)

          if ac.is_valid()*astu.is_valid():
              new_clazz = ac.save()
              new_stu = astu.save(commit=False)
              new_stu.clazz = new_clazz
              new_stu.save()
              return HttpResponse('successfully')
          else:
              return HttpResponse('sorry,you can not register.')
      else:
          ac = Add_Clazz()
          astu = Add_Stu()
          return render(request,'register.html',{'ac':ac,'astu':astu})

    创建模板


    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>


    <form action="/student/register/" method="post">
      {% csrf_token %}
      <p>
          <label for="{{ astu.sname.id_for_label }}">姓名:</label>{{ astu.sname }}
      </p>
      <p>
          <label for="{{ ac.cname.id_for_label }}">班级:</label>{{ ac.cname }}
      </p>
      <p>
          <input type="submit" value="注册" />
      </p>

    </form>

    </body>
    </html>
    1. JS前端校验

    2. forms表单类自定义校验

    表单类


    #coding=utf-8


    from django import forms
    from .models import *

    class Add_Clazz(forms.ModelForm):
      class Meta:
          model = Clazz
          fields = ('cname',)


    class Add_Stu(forms.ModelForm):
      password = forms.CharField(max_length=30,widget=forms.PasswordInput)
      password2 = forms.CharField(max_length=30,widget=forms.PasswordInput)


      class Meta:
          model = Stu
          fields = ('sname',)

      def clean_password2(self):
          cd = self.cleaned_data
          if cd['password']!=cd['password2']:
              self.errors['password2'] = ['密码不一致']

              # raise forms.ValidationError('密码不一致!')
          return cd['password2']


    视图函数


    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals

    from django.http import HttpResponse
    from django.shortcuts import render
    from .forms import Add_Clazz,Add_Stu
    from . models import *
    # Create your views here.

    def register(request):
      if request.method=='POST':
          ac = Add_Clazz(request.POST)
          astu = Add_Stu(request.POST)



          if ac.is_valid()*astu.is_valid():
              try:
                  new_clazz = Clazz.objects.get(cname=ac.cleaned_data['cname'])
              except Clazz.DoesNotExist:
                  #保存数据到数据库
                  new_clazz = ac.save()
              #保存数据对象不提交数据库
              new_stu = astu.save(commit=False)
              new_stu.clazz = new_clazz
              new_stu.password = astu.clean_password2()
              new_stu.save()
              return HttpResponse('successfully')
          else:
              return render(request,'register.html',{'ac':ac,'astu':astu})
      else:
          ac = Add_Clazz()
          astu = Add_Stu()
          return render(request,'register.html',{'ac':ac,'astu':astu})

    模板页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    </head>
    <body>


    <form action="/student/register/" method="post">
    {% csrf_token %}
    <p>
    <label for="{{ astu.sname.id_for_label }}">姓名:</label>{{ astu.sname }}
    </p>
    <p>
    <label for="{{ astu.password.id_for_label }}">密码:</label>{{ astu.password }}
    </p>
    <p>
    <label for="{{ astu.password2.id_for_label }}">密码:</label>{{ astu.password2 }}<span style="color: red;">{{ astu.errors.password2.0 }}</span>
    </p>
    <p>
    <label for="{{ ac.cname.id_for_label }}">班级:</label>{{ ac.cname }}
    </p>
    <p>
    <input type="submit" value="注册" />
    </p>

    </form>

    </body>
    </html>

  • 相关阅读:
    屏蔽 优酷广告
    First Adventures in Google Closure -摘自网络
    Closure Compiler(封闭编辑器), Closure Inspector, Closure Templates, 封闭图书馆(Closure Library) Google- 摘自网络
    据说几年前,微信之父张小龙有一次入京到龙泉寺散心,心中关于微信的产品困惑久久不得解。无聊中,张小龙与寺中扫地僧攀谈起来,发现对方居然懂得技术和产品,深入聊天之后,张小龙震惊于对方的才学与见识,虚心请教,之后闭关七天回到深圳,微信终于大成。
    一个PHP书单 -摘自网络
    关于protel 99se 汉化后某些菜单消失的解决方法
    Protel画完原理图检查的时候出现了这些错误 #1 Error Multiple Net Identifiers
    protel99 se中出现许多Backup of 文件,修改过保存时,总会出现备份文件,怎么才能取消这一设置?
    protel 99se 加载库文件 files not recognised 解决办法-转
    Hosts 文件的作用
  • 原文地址:https://www.cnblogs.com/Py-king/p/10590373.html
Copyright © 2011-2022 走看看