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>
原文地址:https://www.cnblogs.com/sunshine-long/p/12503385.html