• 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>
    
  • 相关阅读:
    让history命令 显示执行命令的时间
    实现SSH免密登录
    数据库表空间一夜之间爆满 查看最大的表却才几百M 原来是大字段对象CLOB造成的
    Python-集合的操作
    Vim使用技巧
    Linux的内部命令和外部命令
    Redis缓存穿透和雪崩
    网络编程学习一:IP地址转换函数
    每日一问15:C++中的.h,cpp以及.hpp文件
    每日一问14: 缓存和缓冲的区别
  • 原文地址:https://www.cnblogs.com/sunshine-long/p/12503385.html
Copyright © 2020-2023  润新知