内容一:显示当前一瞬间的网速
# ifstat
内容二:持续显示网速
# watch ifstat
# ifstat
# watch ifstat
# python3
>>> import types
(补充:这里以导入 types 模块为例)
>>> dir(types)
['BooleanType',
'BufferType',
'BuiltinFunctionType',
'BuiltinMethodType',
'ClassType',
'CodeType',
'ComplexType',
'DictProxyType',
'DictType',
'DictionaryType',
'EllipsisType',
'FileType',
'FloatType',
'FrameType',
'FunctionType',
'GeneratorType',
'GetSetDescriptorType',
'InstanceType',
'IntType',
'LambdaType',
'ListType',
'LongType',
'MemberDescriptorType',
'MethodType',
'ModuleType',
'NoneType',
'NotImplementedType',
'ObjectType',
'SliceType',
'StringType',
'StringTypes',
'TracebackType',
'TupleType',
'TypeType',
'UnboundMethodType',
'UnicodeType',
'XRangeType',
'__all__',
'__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__']
(补充:这里以显示 types 模块里的属性为例)
本实验是接着 《Django 通过自定义 manger 管理器进行自定义查询》而继续的
[root@mariadb ~]# mysql -uroot -p
MariaDB [(none)]> use test;
MariaDB [test]> update test_student SET isdelete=0 WHERE test_student.isdelete=1;
MariaDB [test]> quit;
将 mysite/test/models.py 中的以下内容:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
修改为:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
#def all(self):
# return Manager.all(self).filter(isdelete=True)
def get_queryset(self):
return Manager.get_queryset(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
#objects = CustomManager()
#show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
def delete(self, using=None, keep_parents=False):
self.isdelete = True
self.save()
......
(补充:这里以将 delete 重写成将 isdelete 设置为 True 为例)
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.all()
<QuerySet [<Student: student:False>, <Student: student:False>, <Student: student:False>]>
>>> Student.objects.first().delete()
>>> Student.objects.all()
<QuerySet [<Student: student:True>, <Student: student:False>, <Student: student:False>]>
(补充:这里第一条数据 isdelete=True)
将 mysite/test/models.py 中的以下内容:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
#def all(self):
# return Manager.all(self).filter(isdelete=True)
def get_queryset(self):
return Manager.get_queryset(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
#objects = CustomManager()
#show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
def delete(self, using=None, keep_parents=False):
self.isdelete = True
self.save()
......
修改为:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
#def all(self):
# return Manager.all(self).filter(isdelete=True)
def get_queryset(self):
return Manager.get_queryset(self).filter(isdelete=True)
class DeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class BatchDelManager(Manager):
def get_queryset(self):
return Manager.get_queryset(self).filter(isdelete=False)
def filter(self, *args, **kwargs):
#1. Get the record that needs to be deleted
delList = Manager.get_queryset(self)
#2. Define the closure method to modify isdelete = true
def delete1(delqueryset):
for dq in delqueryset:
dq.isdelete = True
dq.save()
#3. Create an instance method dynamically, declare that delete has a delete method, call interface is delete (delist), call the delete1 object to execute
import types
delList.delete = types.MethodType(delete1,delList)
return delList
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = BatchDelManager()
show = DeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
def delete(self, using=None, keep_parents=False):
self.isdelete = True
self.save()
......
(
补充:
1) 这里以添加一个将父类的 all 重写成将所有 isdelete=True 的数据修改成 isdelete=False 的 BatchDelManager(Manager) 对象并在 Student 类中使用 objects 调用为例
2) 这里的实现方法是:动态创建一个实例方法,对外声明 delete 有一个 delete 方法调用接口是 delete(deList) ,调用 delete1 对象进行执行
3) 这里的 DeletedManager(Manager) 会查看所有 isdelete=True 的数据,并通过 Student 类中的 show 调用
4) 只要子类重写了父类的方法,就不会掉用父类的方法了,而是调用子类的方法
5) 闭包的作用是内部执行一个结果,对外还是一个外部函数的一个调用
6) python2 使用是 new 模块的 instancemethod 属性实现此功能,而 python3 使用是 types 模块的 MethodType属性实现此功能
)
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.all()
<QuerySet [<Student: student:False>, <Student: student:False>]>
(补充:这里的 objects 已经经过了重写,所以只能显示 isdelete=False 的数据)
>>> Student.objects.filter().delete()
>>> Student.objects.all()
<QuerySet []>
(补充:此时已经没有 isdelete=False 的数据)
>>> Student.show.all()
<QuerySet [<Student: student:True>, <Student: student:True>, <Student: student:True>]>
文中的 python 系统名、mysite 项目、user 应用和 Student 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称
(1)服务器的系统需要是 openSUSE 15.2 版本
(2)服务器要关闭防火墙
(3)服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
(4)服务器要能够连接外网
[root@python ~]# zypper -n install python3
[root@python ~]# mkdir project
[root@python ~]# cd project
[root@python project]# python3 -m venv django_env
[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django
(补充:在此次操作发生时,最新的 Django 版本是 3.2)
(django_env) [root@python project]# django-admin startproject mysite
(django_env) [root@python project]# zypper -n install tree
(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
(1)mysite 此 Django 项目的容器
(2)manage.py 命令行工具,与 Django 项目进行交互
(3)mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
(4)mysite/settings.py 此 Django 项目的配置文件
(5)mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
(6)mysite/wsgi.py WSGI 兼容 Web 服务器的入口
(django_env) [root@python mysite]# django-admin startapp test
(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── test
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
3 directories, 13 files
(1)test/app.py 此 Django 应用的容器
(2)test/__init__.py 空文件,通知 python 此项目是一个 python 包
(3)test/admin.py 此 Django 应用自带的后台管理相关的类
(4)test/app.py 此 Django 应用指定应用名的文件
(5)test/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
(6)test/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
(7)test/test.py 此 Django 应用的测试文档
(8)test/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面
在 mysite/mysite/settings.py 中添加以下内容:
......
INSTALLED_APPS = [
......
'test',
]
......
(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client
(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p
MariaDB [(none)]> create database user;
(补充:这里以创建 user 库为例)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
(补充:这里以创建 root 用户,密码是 password 为例)
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
(django_env) [root@python mysite]# systemctl restart mariadb
(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql
在 mysite/mysite/__init__.py 中添加以下内容:
import pymysql
pymysql.install_as_MySQLdb()
在 mysite/test/models.py 中添加以下内容:
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
(补充:这里以创建包含 sname 字段和 isdelete 字段的 Student 类为例)
将 mysite/mysite/settings.py 中的以下内容:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
......
修改为:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'password',
}
}
......
(
补充:这里以
(1)使用的库是 test
(2)使用的服务器是 127.0.0.1
(3)使用的端口是 3306
(4)使用的用户是 root
(5)使用的密码是 password
为例
)
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'user':
user/migrations/0001_initial.py
- Create model Student
(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying user.0001_initial... OK
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.create(sname='zhangsan')
<Student: Student object (1)>
>>> Student.objects.create(sname='lisi',isdelete=True)
<Student: Student object (2)>
>>> Student.objects.create(sname='wangwu',isdelete=True)
<Student: Student object (3)>
(补充:这里以往 Student 类任意插入三条测试数据为例)
>>> quit();
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.all()
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>, <Student: Student object (3)>]>
(补充:此时会一次性查询出 Student 类里所有的数据)
>>> quit();
将 mysite/test/models.py 中的以下内容:
......
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
......
修改为:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
(
补充:
(1)self 在 python 中代表当前对象,在其他语言中,会用 this 来代表当前对象
(2)这里以将父类的 all 重写成只选择 isdelete=True 数据的 CustomManager(Manager) 类并在 Student 类中使用 objects 调用为例
)
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.all()
<QuerySet [<Student: student:True>, <Student: student:True>]>
(补充:这里只查出了 isdelete=True 的数据)
>>> quit();
将 mysite/test/models.py 中的以下内容:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
修改为:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
(补充:这里以添加一个将父类的 all 重写成只选择 isdelete=False 数据的 NotDeletedManager(Manager) 对象并在 Student 类中使用 show 调用为例)
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.show.all()
<QuerySet [<Student: student:False>]>
(补充:这里只查出了 isdelete=False 的数据)
>>> quit();
将 mysite/test/models.py 中的以下内容:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
修改为:
......
from django.db.models.manager import Manager
class CustomManager(Manager):
#def all(self):
# return Manager.all(self).filter(isdelete=True)
def get_queryset(self):
return Manager.get_queryset(self).filter(isdelete=True)
class NotDeletedManager(Manager):
def all(self):
return Manager.all(self).filter(isdelete=False)
class Student(models.Model):
sname = models.CharField(max_length=30)
isdelete = models.BooleanField(default=False)
objects = CustomManager()
show = NotDeletedManager()
def __str__(self):
return u'student:%s'%self.isdelete
......
(补充:这里以添加一个将子类的 get_queryset 重写成只选择 isdelete=True 数据的 CustomManager(Manager) 对象并在 Student 类中使用 objects 调用为例)
(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *
>>> Student.objects.all()
<QuerySet [<Student: student:True>, <Student: student:True>]>
(补充:这里只查出了 isdelete=True 的数据)
>>> quit();
文中的 python 系统名、mysite 项目、user 应用 Clazz 类、Course 类和 Student 类只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称
1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网
[root@python ~]# zypper -n install python3
[root@python ~]# mkdir project
[root@python ~]# cd project
[root@python project]# python3 -m venv django_env
[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django
(补充:在此次操作发生时,最新的 Django 版本是 3.2)
(django_env) [root@python project]# django-admin startproject mysite
(django_env) [root@python project]# zypper -n install tree
(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
1 directory, 5 files
1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口
(django_env) [root@python mysite]# django-admin startapp user
(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── user
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
3 directories, 13 files
1) user/app.py 此 Django 应用的容器
2) user/__init__.py 空文件,通知 python 此项目是一个 python 包
3) user/admin.py 此 Django 应用自带的后台管理相关的类
4) user/app.py 此 Django 应用指定应用名的文件
5) user/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) user/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) user/test.py 此 Django 应用的测试文档
8) user/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面
在 mysite/mysite/settings.py 中添加以下内容:
......
INSTALLED_APPS = [
......
'user',
]
......
在 mysite/mysite/urls.py 中添加以下内容:
......
from django.conf.urls import url, include
......
urlpatterns = [
......
url(r'^register/', include('user.urls')),
]
(补充:这里以设置 /register/ 链接对应 user 应用的链接为例)
(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client
(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p
MariaDB [(none)]> create database user;
(补充:这里以创建 user 库为例)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
(补充:这里以创建 root 用户,密码是 password 为例)
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit
(django_env) [root@python mysite]# systemctl restart mariadb
(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql
在 mysite/mysite/__init__.py 中添加以下内容:
import pymysql
pymysql.install_as_MySQLdb()
在 mysite/user/models.py 中添加以下内容:
class Clazz(models.Model):
cno = models.AutoField(primary_key=True)
cname = models.CharField(max_length=30)
def __str__(self):
return u'Clazz:%s'%self.cname
class Course(models.Model):
course_no = models.AutoField(primary_key=True)
course_name = models.CharField(max_length=30)
def __str__(self):
return u'Course:%s'%self.course_name
class Student(models.Model):
sno = models.AutoField(primary_key=True)
sname = models.CharField(max_length=30)
cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
cour = models.ManyToManyField(Course)
def __str__(self):
return u'Student:%s'%self.sname
# Get class object according to class name
def getCls(cname):
try:
cls = Clazz.objects.get(cname=cname)
except Clazz.DoesNotExist:
cls = Clazz.objects.create(cname=cname)
return cls
def getCourseList(*coursenames):
courseList = []
for cn in coursenames:
try:
c = Course.objects.get(course_name=cn)
except Course.DoesNotExist:
c = Course.objects.create(course_name=cn)
courseList.append(c)
return courseList
def registerStu(sname,cname,*coursenames):
#1. Get class objects
cls = getCls(cname)
#2. Gets the list of course objects
courseList = getCourseList(*coursenames)
#3. Insert student table data
try:
stu = Student.objects.get(sname=sname)
except Student.DoesNotExist:
stu = Student.objects.create(sname=sname,cls=cls)
#4. Insert intermediate table data
stu.cour.add(*courseList)
return True
(
补充:
1) 这里 getCls 对象的作用是获取 cname 变量,如果数据库中没有 cname 变量的值则直接插入这个值
2) 这里 getCourseList 对象的作用是获取 coursenames 变量,如果数据库中没有 coursenames 变量的值则直接插入这个值
3) 这里 registerStu 对象的作用是执行 getCls 对象和 getCourseList 对象,获取 sname 变量,如果数据库中没有 sname 变量的值则直接插入这个值
)
将 mysite/mysite/settings.py 中的以下内容:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
......
修改为:
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'user',
'HOST': '127.0.0.1',
'PORT': '3306',
'USER': 'root',
'PASSWORD': 'password',
}
}
......
(
补充:这里以
1) 使用的库是 user
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例
)
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'user':
user/migrations/0001_initial.py
- Create model Clazz
- Create model Course
- Create model Student
(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
Applying user.0001_initial... OK
(补充:此时会在数据库里生成三张表 user_clazz 表、user_course 表、user_student 表和 user_student_cour 表,其中 user_student_cour 表是 user_course 表和 user_student 表的中间表)
创建 mysite/user/templates/register.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>register</title>
</head>
<body>
<form action="/register/" method="post">
{% csrf_token %}
<p>
<label for="sn">Name: </label><input name="sname" id="sn"/>
</p>
<p>
<label for="sc">Classroom: </label>
<select name="clsname" id="sc">
<option value="Class 1">Class 1</option>
<option value="Class 2">Class 2</option>
<option value="Class 3">Class 3</option>
</select>
</p>
<p>
<label for="cour">Course Selection: </label>
<input type="checkbox" name="coursename" value="Python"/>Python  
<input type="checkbox" name="coursename" value="Shell"/>Shell  
<input type="checkbox" name="coursename" value="HTML"/>HTML  
<input type="checkbox" name="coursename" value="Django"/>Django  
</p>
<p>
<input type="submit" value="Register"/>
</p>
</form>
</body>
</html>
(
补充:这里以
1) 生成一个用户名输入栏,赋值给 sname
2) 生成一个单选框,赋值给 clsname
3) 生成一个多选框,赋值给 cour
4) 生一个注册按钮
为例
)
创建 mysite/user/templates/showall.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>register</title>
</head>
<body>
<table border="1" cellspacing="0" width="500px">
<tr>
<th>Code</th>
<th>ClassRoom</th>
<th>Operation</th>
</tr>
{% for c in cls %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ c.cname }}</td>
<td>
<a href="/register/getstu/?cno={{ c.cno }}">details</a>
</td>
<tr>
{% endfor %}
</table>
</body>
</html>
(补充:这里以生成显示全部数据的列表为例)
创建 mysite/user/templates/stulist.html 并添加以下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>register</title>
</head>
<body>
<table border="1" cellspacing="0" width="500px">
<tr>
<th>Code</th>
<th>Student Name</th>
<th>Classroom Name</th>
<th>Course Name</th>
</tr>
{% for stu in stus %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ stu.sname }}</td>
<td>{{ stu.cls.cname }}</td>
<td>
{% for st in stu.cour.all %}
{{ st.course_name }}
{% endfor %}
</td>
<tr>
{% endfor %}
</table>
</body>
</html>
(
补充:
1) 这里以生成显示某一条 Classroom Name 为特定值的所有相关数据为例
2) 这里模版语法 all 后面不用加小括号“()”:
{% for st in stu.cour.all %}
)
在 mysite/user/views.py 中添加以下内容:
......
from django.shortcuts import render
from .models import *
from django.http import HttpResponse, request
......
def index_view(request):
if request.method == 'GET':
return render(request,'register.html')
else:
# Receive request parameters
sname = request.POST.get('sname','')
cname = request.POST.get('clsname','')
coursenames = request.POST.getlist('coursename',[])
# Register data to database
flag = registerStu(sname,cname,*coursenames)
if flag:
return HttpResponse('register success!')
return HttpResponse('register fale!')
def showall_view(request):
#Display all classroom informations
cls = Clazz.objects.all()
return render(request,'showall.html',{'cls':cls})
def getstu_view(request):
#Get classroom code
cno = request.GET.get('cno','')
mno = int(cno)
#Get student information from class code
stus = Clazz.objects.get(cno=mno).student_set.all()
return render(request,'stulist.html',{'stus':stus})
(
补充:这里以
1) 获取来自 HTML 的 sanme、clsname 和 coursename 变量
2) 使用 registerStu 对象处理所有变量,处理成功则返回 success! 否则返回 fale!
3) 使用 showall_view 对象将所有数据传递给 showall.html
4) 使用 getstu_view 对象将某一条 Classroom Name 为特定值的所有相关数据传递给 stulist.html
为例
)
创建 mysite/user/urls.py 并添加以下内容:
from django.conf.urls import url
from user.views import *
urlpatterns=[
url(r'^$',index_view),
url(r'^showall/$',showall_view),
url(r'^getstu/$',getstu_view),
]
(补充:这里以设置空链接链接对应 index_view 模块为例)
(django_env) [root@python mysite]# python3 manage.py runserver
1) 打开浏览器输入以下网址:
http://127.0.0.1:8000/register/
2) 可以看到 Name 输入栏、Classroom 单选框、Course Selection 多选框和 Register 注册按钮,并可以注册信息
3) 打开浏览器输入以下网址:
http://127.0.0.1:8000/showall/
4) 可以看到刚才注册的信息并且还有链接看到详细内容