1、Django 入门
一、环境搭建
1、指定版本安装django
pip install django==1.8.2
2、创建项目
django-admin startproject commpany
# 目录下多了一个commpany $ tree commpany/ commpany/ ├── commpany │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py
至此创建好一个 commpany的项目。再来创建一个公司的部门模块,作为一个项目中的应用。
3、创建应用
cd commpany/
python2 manage.py startapp department
# 项目架构
$ tree
.
├── commpany # 和项目名称同名
│ ├── __init__.py # 空文件
│ ├── settings.py # 全局配置文件
│ ├── urls.py # 全局路由配置
│ └── wsgi.py #
├── department # 应用模块
│ ├── __init__.py
│ ├── admin.py # 后台管理
│ ├── apps.py
│ ├── migrations # 模型模块执行迁移
│ │ └── __init__.py
│ ├── models.py # 模型处理模块
│ ├── tests.py
│ └── views.py # 视图模块
└── manage.py
二、模型设计
1、模型需要和数据库进行交互,首先配置settings.py,修改数据库配置。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST':'127.0.0.1', 'PORT':'3306', 'USER':'root', 'PASSWORD':'root', 'NAME': 'company', } }
2、department.moduls.py文件中设计模型
class department(models.Model):
# 部门ID
d_id = models.IntegerField()
# 部门名称,Char类型,长度20
d_name = models.CharField(max_length=20)
# 部门人员数量,int类型,长度10
d_num = models.IntegerField()
def __str__(self):
return self.d_name.encode('utf-8')
# 定义一个人员表
class staffInfo(models.Model):
s_id = models.IntegerField()
s_name = models.CharField(max_length=20)
s_gender = models.BooleanField()
s_detailInfo = models.TextField()
s_date = models.DateTimeField()
# s_date = models.DateTimeField(default = timezone.now)
s_department = models.ForeignKey(department)
def __str__(self):
return self.s_name.encode('utf-8')
3、生成表之前在settings配置文件注册应用信息。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'department', # 添加应用名称 ]
4、生成数据表,执行前要确认mysql中存在settings.py中配置的数据库名称。
# 生成迁移文件
python manage.py makemigrations
# 执行迁移
python2 manage.py migrate
注意:使用mysql需要安装pymysql模块,pip install pymysql既可。然后在项目的__init__.py中导入mysql模块。
import pymysql
pymysql.install_as_MySQLdb()
执行时报了一个警告,并不影响迁移结果。
department.department.d_num: (fields.W122) 'max_length' is ignored when used with IntegerField HINT: Remove 'max_length' from field
去掉 d_num = models.IntegerField(max_length=10) 中的长度约束既可。
5、检查mysql。
mysql> use company; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------------------+ | Tables_in_company | +----------------------------+ | auth_group | | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | department_department | | department_staffinfo | | django_admin_log | | django_content_type | | django_migrations | | django_session | +----------------------------+ 12 rows in set (0.00 sec)
可以发现,实际的表名和moduls中的有所不同。
6、运行项目。
$ python2 manage.py runserver [可以指定端口号] Performing system checks... System check identified no issues (0 silenced). March 16, 2020 - 05:29:27 Django version 1.11.27, using settings 'commpany.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
7、浏览器访问127.0.0.1:8000
三、后台管理
后台管理
有了表,我们就要往里面添加数据,目前没有前端页面,可以通过后台管理系统对表进行增删改查操作。
1、首先,添加一个后台管理的账号。
$ python2 manage.py createsuperuser # 根据提示输入信息。 Username (leave blank to use 'steven'): admin Email address: admin@163.com Password: Password (again): Superuser created successfully.
2、运行项目,浏览器访问后台管理http://127.0.0.1:8000/admin。
3、页面汉化
settings.py中修改:
setting.py LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
此时,并没有将模型类添加到admin管理后台
4、booktest/admin.py 注册模型。
from models import *
admin.site.register(department)
admin.site.register(staffInfo)
刷新浏览器,出现Department管理。
在前端可以对数据库进行一些增删改查。
自定义管理界面。
Django提供了admin.ModelAdmin类
通过定义ModelAdmin的子类,来定义模型在Admin界面的显示方式
1、想让Staff info展示更多的内容,在admin.py中添加类。
class departmentInfoAdmin(admin.ModelAdmin):
list_display = ["d_id","d_name","d_num"]
admin.site.register(department,departmentInfoAdmin)
admin.site.register(staffInfo)
2、列表页属性
- list_display:显示字段,可以点击列头进行排序
- list_filter:过滤字段,过滤框会出现在右侧
- search_fields:搜索字段,搜索框会出现在上侧
- list_per_page:分页,分页框会出现在下侧
class departmentInfoAdmin(admin.ModelAdmin):
list_display = ["d_id","d_name","d_num"]
list_filter = ['d_id']
search_fields = ['d_name']
list_per_page = 10
3、添加、修改液属性。
- fieldsets:属性分组
- fields:属性的先后顺序
关联对象
对象注册对象有两种方式:
- 1、跟department一样
- 关联注册
显示性别
modules.py文件添加方法,在admin.py中用 gender代替 s_gender
def gender(self): if self.s_gender: return '男' else: return '女' gender.short_description = '性别'
四、视图 view
后台数据有了,如何显示在页面上,又如何从页面添加数据。
- django中,视图对WEB请求进行回应
- 视图接收reqeust对象作为第一个参数,包含了请求的信息
- 视图就是一个Python函数,被定义在views.py中
1、定义视图
from django.http import HttpResponse def index(request): return HttpResponse("index") def detail(request): return HttpResponse("det")
有了视图,需要让用户可以访问
2、配置url
- 项目company下面urls.py中添加
from django.conf.urls import nclude urlpatterns = [ ... url(r'^', include('company.urls')), ]
department应用下创建urls.py文件
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index), url(r'^(d+)/$', views.detail), # 匹配的数字加上小括号表示要将匹配到的数字当做参数传给 views.details函数。 ]
通过浏览器访问127.0.0.1:8000既可以匹配到views的index方法,127.0.0.1:8000/details即可以匹配到details方法。
3、通过模板展示。
- 应用同级目录下创建templates/department目录
- settings配置文件修改如下配置
TEMPLATES = [ { ... 'DIRS': [os.path.join(BASE_DIR,'templates')],
- 视图views.py文件中修改方法
def index(request): # 从模型中拿数据,即 类名.objects.all() departments = department.objects.all() context = {'list':departments} # 渲染templates模板下的department/index.html文件,并将context作为参数传给index.html return render(request,'department/index.html', context)
编辑 templates/department/index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>department</title> </head> <body> {% for department in list %} <li>{{department.d_id}}</li> <li>{{department.d_name}}</li> {% endfor %}
# 固定写法,遍历从views视图传过来的list,用{{}}展示department的属性,d_id,d_name即从moduls.py定义的字段
</body> </html
浏览器访问即可看到所有部门的id和名称。
5、点击部门名称,显示部门内成员。
- index.html给部门名称添加<a>标签
<li><a href="{{department.d_id}}">{{department.d_name}}</a></li>
当点击部门名称,部门id则会将id传输给路由,路由将id作为参数传参给details方法。
- 修改details函数
def detail(request,id): D= department.objects.get(pk=id) staff_list = D.staffinfo_set.all() context = {'list':staff_list} return render(request,'department/details.html',context)
- templates/department/目录下添加details.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>details</title> </head> <body> {% for staff in list %} {{staff.s_name}} {% endfor %} </body> </html>