python的Django框架应用(2)

原文链接:http://blog.csdn.net/qq_38776653/article/details/75045149

一、创建新的app(student)

这里写图片描述

1、全局路由规则和app路由规则建立联系

由于上次没有配置全局的路由规则或者没有让项目路由和app路由建立联系,也可以直接写在全局的路由规则里面,但是一旦多,将会造成混乱,不好调用。所以最好还是在每个app建立一个盛放路由规则的容器,即urls.py文件。

"""student_app URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin

urlpatterns = [

]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

全局路由设置(myschool/urls.py)

"""myschool URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.conf.urls import url, include
    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
"""
'''导入模块url,和include,这里include作用是标记命名空间,可以在不同的app里面命名相同的文件名'''
from django.conf.urls import url,include
from django.contrib import admin
#导入两个app模块
import student
import grade

urlpatterns = [
    url(r'^admin/', admin.site.urls),
 '''url()里面前面是正则表达式,用来匹配请求或者说url路径,后面的include里面前面是跳转的页面或者说文件(注意路径要加上引号),namespace是命名空间,避免由于不同app里面的文件名相同,产生混乱。'''
    url(r'^grade/',include('grade.urls',namespace='grade')),
    url(r'^student/',include('student.urls',namespace='student')),

]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

2、在项目配置文件增加已安装好的app的配置

修改增加myschool/settings.py

# Application definition
'''只要增加应用必须在这里面增加配置,便于该项目能够很快的查到该应用文件,否则会报错'''
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'grade.apps.GradeConfig',
    'student.apps.StudentConfig',
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3、创建student实体类和数据库

3.1创建实体类

student/models.py

from django.db import models

# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
    class Meta:
        # 给整个app设置别名
        verbose_name='学生'
        # 给该app里面的组成元素设置别名
        verbose_name_plural='学生'
#     给实体类设置属性,或者说设置数据库里面表的字段属性
    name=models.CharField('学生姓名',max_length=50,null=False)
    sex=models.CharField('性别',max_length=2)
    born=models.DateField('出生日期')
    city=models.CharField('城市',max_length=100)
    likes=models.CharField('爱好',max_length=100)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.2建立数据库 
前面的配置就不详细介绍了,具体配置请参考 
http://blog.csdn.net/qq_38776653/article/details/74853040 
调出mange.py项目控制界面,快捷键“Ctrl+Alt+r”

manage.py@myschool > **makemigrations student**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py makemigrations student D:/项目/myschool
Migrations for 'student':
  student\migrations\0001_initial.py
    - Create model Student
Following files were affected 
 D:\项\myschool\student\migrations\0001_initial.py
Process finished with exit code 0
manage.py@myschool > **sqlmigrate student 0001**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py sqlmigrate student 0001 D:/项目/myschool
BEGIN;
--
-- Create model Student
--
CREATE TABLE `student_student` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(50) NOT NULL, `sex` varchar(2) NOT NULL, `born` date NOT NULL, `city` varchar(100) NOT NULL, `likes` varchar(100) NOT NULL);
COMMIT;
Following files were affected
Process finished with exit code 0
manage.py@myschool > **migrate student**
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py migrate student D:/项目/myschool
Operations to perform:
  Apply all migrations: student
Running migrations:
  Applying student.0001_initial... OK
Following files were affected
Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

这里就不详细介绍每个命令的用处 
这里写图片描述

4、把该项目连接到管理app

4.1修改student/admin.py

from django.contrib import admin
from . import models
# Register your models here.
class Admin_student(admin.ModelAdmin):
    list_display=['name','sex','born','city','likes']
admin.site.register(models.Student,Admin_student)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.2启动服务器, 
登陆时,有时会出现这种情况,可能的原因就是重复登陆,或者有点卡,再重新登陆就基本没事,也有可能是路由规则不对,检查一下,还有可能是网页的url输入不正确。 
这里写图片描述
从这个可以看到app,student已经添加成功。 
这里写图片描述
添加数据后的页面如下: 
这里写图片描述
添加记录后的数据库情况如下: 
这里写图片描述
4.3创建表的外键,并修改数据库的方式 
在上述的操作过程中,没有设置外键,现在就要添加外键,并更新数据库。 
修改student/models.py文件,内容如下:

from django.db import models
#一定要注意导包的格式
from grade.models import Grade
# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
    class Meta:
        # 给整个app设置别名
        verbose_name='学生'
        # 给该app里面的组成元素设置别名
        verbose_name_plural='学生'
#     给实体类设置属性,或者说设置数据库里面表的字段属性
    name=models.CharField('学生姓名',max_length=50,null=False)
    sex=models.CharField('性别',max_length=2)
    born=models.DateField('出生日期')
    city=models.CharField('城市',max_length=100)
    likes=models.CharField('爱好',max_length=100)
    # 设置外键注意要导模块,verbose_name是外键设置的别名
    grade=models.ForeignKey(Grade,null=True,verbose_name='班级')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

然后用manage.py@myschool(Ctrl+Alt+r)界面对文件进行二次处理, 
处理方式如下:

manage.py@myschool > makemigrations student
"D:\Program Files\JetBrains\IntelliJ IDEA 2017.1.3\bin\runnerw.exe" C:\Users\Administrator\AppData\Local\Programs\Python\Python36-32\python.exe C:\Users\Administrator\.IntelliJIdea2017.1\config\plugins\python\helpers\pycharm\django_manage.py makemigrations student D:/项目/myschool
Migrations for 'grade':
  grade\migrations\0002_auto_20170713_1352.py
    - Change Meta options on grade
Migrations for 'student':
  student\migrations\0002_student_grade.py
    - Add field grade to student
Following files were affected 
 D:\项\myschool\grade\migrations\0002_auto_20170713_1352.py
D:\项\myschool\student\migrations\0002_student_grade.py
Process finished with exit code 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

同时会产生一个文件

这里写图片描述
扩展:如果将数据库里面的表格进行删除之后,要重新创建表,是否能按照以前的创建方法。 
答案是:不能直接创建。因为在创建和修改过程中,会生成一些日志信息,存在数据库里面,必须将日志删除后才会成功。 
日志信息会存储到下表里面。 
这里写图片描述
这里写图片描述
这里写图片描述
扩展:如果将数据库里面的表格进行删除之后,要重新创建表,是否能按照以前的创建方法。 
答案是:不能直接创建。因为在创建和修改过程中,会生成一些日志信息,存在数据库里面,必须将日志删除后才会成功。 
日志信息会存储到下表里面。 
这里写图片描述
所以除了删除表之外,还应该删除在表Django_migrations里的记录,有时也要删除该app项目目录下的migrations目录下的文件。

二、用Django框架做web编程

1、添加数据(以student实体类为例)

先将实体类绑定成表单,本博主修改的是student/views.py

# 导入转发模块
from django.shortcuts import render
#导入重定向模块
from django.shortcuts import redirect
#导入表达表单模块
from django import forms
#导入实体类
from . import  models
# 导入插件或者小部件模块
from django.contrib.admin import widgets
# Create your views here.
# 把实体类绑定表单
class student_form(forms.ModelForm):

    # 绑定日期类型的字段,注意:DateField,AdminDateWidget一定要一致,生成日期类型表单
    born = forms.DateField(widget=widgets.AdminDateWidget(),label='生日')
    #绑定邮箱框
    email=forms.EmailField(widget=forms.EmailInput(),label='邮箱')
    #绑定密码框
    pwd = forms.CharField(widget=forms.PasswordInput(),label='密码')
    #绑定单选框
    sex=forms.CharField(widget=forms.RadioSelect(choices=[('男','男'),('女','女')]),label='性别')
    #绑定下拉列表
    city=forms.CharField(widget=forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),label='城市')
    # 绑定复选框
    likes=forms.CharField(widget=forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')]),label='爱好')
    # 创建内部类Meta来绑定字符等字段,生成输入框,单选框,复选框,等表单
    class Meta:
        # 建立实体类模型
        model=models.Student
        # 将实体类或者数据库中的属性或字段提取出来,形成数组,这也代表页面显示的表单名
        fields='__all__'
        # 注意写下面的方式会爆出异常
        # django.core.exceptions.ImproperlyConfigured: Creating a ModelForm
        #  without either the 'fields' attribute or the 'exclude' attribute is prohibited; form student_forms needs updating.
        # 改成上面的方式将不会报错
        # fileds=['name','grade',' sex','born','city','likes']
        # 下面这种方式创建不稳定,如果说外部类的格式声明过多时就不会显示这些格式
        # 小编在外面声明三个就不显示下面的格式
        # widget={#单选框
        #     'sex': forms.RadioSelect(choices=[('男','男'),('女','女')]),
        #     # 复选框
        #     'city': forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),
        #     # 下拉列表
        #     'likes': forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')])
        # }
def addRender(request):
    # 生成表单实例
    sf=student_form
    #将请求转发到../web/add.html,并携带参数{'form':sf}
    return render(request,'../web/add.html',{'form':sf})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

修改student/urls.py文件

from django.conf.urls import url
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
     # 根据请求(url)和正则表达式跳转到views.py里面的方法,相当于java中的过滤器或者中转站
     # 这里的name是将该路径取一个别名,便于访问
     url(r'^add$',views.addRender,name='add'),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

创建html网页,在项目下web目录下 
创建add.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
   <!--这是形成日期的格式-->
    <link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />
    <link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" />

    <script type="text/javascript" src="/admin/jsi18n/"></script>
    <script type="text/javascript" src="/static/admin/js/core.js"></script>
    <script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
    <script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
    <script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
    <script type="text/javascript" src="/static/admin/js/actions.js"></script>
    <script type="text/javascript" src="/static/admin/js/urlify.js"></script>
    <script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
    <script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.js"></script>
    <script type="text/javascript" src="/static/admin/js/calendar.js"></script>
    <script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
</head>
<body>
{#{% url 'student:save'  %}#}
<form action="" method="post">
    <!--这是表单必须有的,这是一种安全模式(跨站点请求伪造),否则会报错-->
    {% csrf_token %}
{#    这是将传过来的绑定好的表单按照段落进行遍历#}
    {{ form.as_p  }}

    <input type="submit" value="提交">
</form>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

开启服务器输入下面网址: 
http://localhost:8000/student/add 
这里写图片描述

二、实现学生用户的增删改查

具体的编写过程就不详细说了,下面是编写的代码: 
整个项目的名称是:myschool 
整个项目有两个app分别是:grade和student 
对于整个项目的setting.py(myschool/settings.py)的设置如下(这里就不解释每个设置的作用):

"""
Django settings for myschool project.

Generated by 'django-admin startproject' using Django 1.11.3.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '0*_a@(rp^%)p%!q01s)$+khj7hp*(o_&1j&1zy6h*0n0(d12fo'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'grade.apps.GadeConfig',
    'student.apps.StudentConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'myschool.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR+"/web",],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'myschool.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'myschool',
        'USER':'root',
        'PASSWORD':'mysql',
        'HOST':'localhost',
        'PORT':'3306',
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScr


ipt, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130

myschool/urls.py

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

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #后面的namespace指的是命名空间,避免在不同app下的由于文件重名而产生的错误
    url(r'^student/',include('student.urls',namespace='student')),
    url(r'^grade/',include('grade.urls',namespace='grade')),
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

grade/models.py

# 创建一个班级类,继承models.Model的类
class Grade(models.Model):
    class Meta:
        # app别名的单数
        verbose_name='年级'
        # app别名的复数
        verbose_name_plural='年级'
    # 班级名称,类型是字符字段,别名是‘班级名称’,最大长度是50(这是字符字段必须写的),
    # 不能为空,唯一
    name=models.CharField('班级名称',max_length=50,null=False,unique=True)
    # 开班日期,类型日期字段,别名‘开班日期’,这个作用之后会显现
    createDate=models.DateField('开班日期')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

students/models.py

# Create your models here.
# 创建一个学生实体类,继承models.Model类
class Student(models.Model):
    class Meta:
        # 给整个app设置别名
        verbose_name='学生'
        # 给该app里面的组成元素设置别名
        verbose_name_plural='学生'
    #     给实体类设置属性,或者说设置数据库里面表的字段属性
    name=models.CharField('学生姓名',max_length=50,null=False)
    sex=models.CharField('性别',max_length=2)
    born=models.DateField('出生日期')
    city=models.CharField('城市',max_length=100)
    likes=models.CharField('爱好',max_length=100)
    email=models.CharField('邮箱',max_length=50)
    pwd=models.CharField('密码',max_length=20)
    # 设置外键注意要导模块,verbose_name是外键设置的别名
    grade=models.ForeignKey(Grade,null=True,verbose_name='班级')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

student/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    # 根据请求(url)和正则表达式跳转到views.py里面的方法,相当于java中的过滤器或者中转站
    # 这里的name是将该路径取一个别名,便于访问
    # url(r'^add/(?P<id>[0-9]+)/$',views.add,name='add'),
    #     传递的url里面含有参数
    url(r'^add/(?P<id>[0-9]+)/$',views.add,name='add'),
    url(r'^save/(?P<id>[0-9]+)/$',views.save,name='save'),
    url(r'^delete/(?P<id>[0-9]+)/$',views.delete,name='delete'),
    url(r'^list$',views.list,name='list'),

]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

student/views.py

# 导入转发模块
from django.shortcuts import render
#导入重定向模块
from django.shortcuts import redirect
#导入表达表单模块
from django import forms
#导入实体类
from . import  models
# 导入插件或者小部件模块
from django.contrib.admin import widgets
# Create your views here.
# 把实体类绑定表单
class student_form(forms.ModelForm):

    # 绑定日期类型的字段,注意:DateField,AdminDateWidget一定要一致,生成日期类型表单
    born = forms.DateField(widget=widgets.AdminDateWidget(),label='生日')
    #绑定邮箱框
    email=forms.EmailField(widget=forms.EmailInput(),label='邮箱')
    #绑定密码框
    pwd = forms.CharField(widget=forms.PasswordInput(),label='密码')
    #绑定单选框
    sex=forms.CharField(widget=forms.RadioSelect(choices=[('男','男'),('女','女')]),label='性别')
    #绑定下拉列表
    city=forms.CharField(widget=forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),label='城市')
    # 绑定复选框
    likes=forms.CharField(widget=forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')]),label='爱好')
    # 创建内部类Meta来绑定字符等字段,生成输入框,单选框,复选框,等表单
    class Meta:
        # 建立实体类模型
        model=models.Student
        # 将实体类或者数据库中的属性或字段提取出来,形成数组,这也代表页面显示的表单名
        fields='__all__'
        # 注意写下面的方式会爆出异常
        # django.core.exceptions.ImproperlyConfigured: Creating a ModelForm
        #  without either the 'fields' attribute or the 'exclude' attribute is prohibited; form student_forms needs updating.
        # 改成上面的方式将不会报错
        # fileds=['name','grade',' sex','born','city','likes']
        # 下面这种方式创建不稳定,如果说外部类的格式声明过多时就不会显示这些格式
        # 小编在外面声明三个就不显示下面的格式
        # widget={#单选框
        #     'sex': forms.RadioSelect(choices=[('男','男'),('女','女')]),
        #     # 复选框
        #     'city': forms.Select(choices=[('北京','北京'),('南京','南京'),('东京','东京')]),
        #     # 下拉列表
        #     'likes': forms.CheckboxSelectMultiple(choices=[('游戏','游戏'),('体育','体育'),('艺术','艺术'),('旅游','旅游')])
        # }
# 这个方法是对数据库进行增加和修改,这相当于java中的Servlet层
def add(request,id):
    # 表明是增加操作
    if id=='0':
        # 生成表单实例
        sf=student_form
        id='0'
    # 表名是修改操作
    else:
        #     查到数据,封装成实体类对象
        student=models.Student.objects.get(id=id)
        #     对数据对象进行绑定表单
        sf=student_form(instance=student)
    return render(request,'../web/add.html',{'form':sf,'id':id})
# 将网页中的请求内容保存到数据库中,或者将修改数据
def save(request,id):
    # 判断是否是修改还是增加的数据记录
    if id == "0":
    # 创建新的实体类对象
        student=models.Student()
    else:
        student=models.Student.objects.get(id=id)
    #  绑定
    form=student_form(request.POST,instance=student)
    #     判断是否绑定合法
    if form.is_valid() :
        # 合法保存数据
        # 等价于form.save(commit)
        #     重定向redirect是把请求发送到别的操作方法里面,地址是相对于整个项目来说(符合url.py里面的路由规则)
        # 所以只会从项目下的urls.py里面查找路由规则
        # 转发render是将请求和结果转发到别的网页页面,所以地址是相对
        form.save()

    else:
        # 如果不合法转发到原页面
        return render(request,'add.html',{'form':form,"id":id})
        #如果保存完成, 重定向到/student/list,不能带参数过去
    return redirect('/student/list')

# # 该方法是将数据库里面的记录查找出来,按照条件查询
def list(request):
    # 如果请求是POST说明带的有参数则根据参数查找
    if request.method=='POST':
        #         根据名字查找记录
        students=models.Student.objects.filter(name__contains=request.POST['likename'])
    else:
        # 查找所有的记录
        students=models.Student.objects.all()
    return render(request,'list.html',{'students':students})
# 该方法是对记录进行删除
def delete(request,id):
    # 查找记录
    student=models.Student.objects.get(id=id)
    # 删除记录
    student.delete()
    # 返回首页
    return redirect('/student/list')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

web/add.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
   <!--这是形成日期的格式-->
    <link rel="stylesheet" type="text/css" href="/static/admin/css/base.css" />
    <link rel="stylesheet" type="text/css" href="/static/admin/css/forms.css" />

    <script type="text/javascript" src="/admin/jsi18n/"></script>
    <script type="text/javascript" src="/static/admin/js/core.js"></script>
    <script type="text/javascript" src="/static/admin/js/vendor/jquery/jquery.js"></script>
    <script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
    <script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"></script>
    <script type="text/javascript" src="/static/admin/js/actions.js"></script>
    <script type="text/javascript" src="/static/admin/js/urlify.js"></script>
    <script type="text/javascript" src="/static/admin/js/prepopulate.js"></script>
    <script type="text/javascript" src="/static/admin/js/vendor/xregexp/xregexp.js"></script>
    <script type="text/javascript" src="/static/admin/js/calendar.js"></script>
    <script type="text/javascript" src="/static/admin/js/admin/DateTimeShortcuts.js"></script>
</head>
<body>
{#{% url 'student:save'  %}#}
{#{%  result %}#}
<form action="{% url 'student:save' '0'   %}" method="post">
    <!--这是表单必须有的,这是一种安全模式(跨站点请求伪造),否则会报错-->
    {% csrf_token %}
{#    这是将传过来的绑定好的表单按照段落进行遍历#}
    {{ form.as_p  }}

    <input type="submit" value="提交">
</form>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

web/list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="{% url 'student:add' '0' %}">添加</a><br/>


    <form action="{% url 'student:list' %}" method="post">
        {% csrf_token %}
{#        value={{ request.POST.likename }}#}
        姓名:<input type="text"  name='likename' value={{ request.POST.likename }}/>
        <input type="submit" value="查询"/>
    </form>
    <table border="2px">
        <tr>
            <th>学生姓名</th>
            <th>性别</th>
            <th>出生日期</th>
            <th>城市</th>
            <th>爱好</th>
            <th>邮箱</th>
            <th>密码</th>
            <th>操作</th>
        </tr>
    {% for student in students %}
        <tr>
            <td>{{ student.name }} </td>
            <td>{{ student.sex }}</td>
            <td>{{student.born  }}  </td>
            <td>{{ student.city }}</td>
            <td>{{ student.likes }}</td>
            <td>{{ student.email }}  </td>
            <td>{{ student.pwd }}</td>
            <td>
                <a href="{% url 'student:add' student.id%}">修改</a>
                <a href="{% url 'student:delete' student.id %}">删除</a>
            </td>

        </tr>

    {% endfor %}
    </table>
</form>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

具体的实现结果这里就不详细介绍了。 
三、整个项目的执行过程流程图如下: 
这里写图片描述



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值