项目准备

创建项目+创建应用+安装应用+配置模板路径+本地化+mysql数据库+URLconf+视图

  • 安装应用,关闭csrf中间件

  • INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'book'
    ]
    
    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',
    ]
    
  • mysql数据库使用之前的book

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1', # 数据库主机
            'PORT': 3306, # 数据库端口
            'USER': 'root', # 数据库用户名
            'PASSWORD': 'mysql', # 数据库用户密码
            'NAME': 'book' # 数据库名字
        }
    }
    
  • 模型:定义模型类

  • # 准备书籍列表信息的模型类
    class BookInfo(models.Model):
        # 创建字段,字段类型...
        name = models.CharField(max_length=20, verbose_name='名称')
        pub_date = models.DateField(verbose_name='发布日期',null=True)
        readcount = models.IntegerField(default=0, verbose_name='阅读量')
        commentcount = models.IntegerField(default=0, verbose_name='评论量')
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
        image = models.ImageField(upload_to='book', null=True, verbose_name='图片')
    
        class Meta:
            db_table = 'bookinfo'  # 指明数据库表名
            verbose_name = '图书'  # 在admin站点中显示的名称
    
        def __str__(self):
            """定义每个数据对象的显示信息"""
            return self.name
    

    迁移,执行迁移后插入数据

    insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) values
    ('射雕英雄传', '1980-5-1', 12, 34, 0),
    ('天龙八部', '1986-7-24', 36, 40, 0),
    ('笑傲江湖', '1995-12-24', 20, 80, 0),
    ('雪山飞狐', '1987-11-11', 58, 24, 0);
    
  • 模型:定义模型类

  • # 准备人物列表信息的模型类
    class PeopleInfo(models.Model):
    
        name = models.CharField(max_length=20, verbose_name='名称')
        password = models.CharField(max_length=20,verbose_name='密码')
        description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
        book = models.ForeignKey(BookInfo, related_name='people',on_delete=models.CASCADE, verbose_name='图书')  # 外键
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    
        class Meta:
            db_table = 'peopleinfo'
            verbose_name = '人物信息'
    
        def __str__(self):
            return self.name
    

    迁移,执行迁移后插入数据

    insert into peopleinfo(name, password, book_id, description, is_delete)  values
        ('郭靖', '123456abc', 1, '降龙十八掌', 0),
        ('黄蓉', '123456abc', 1, '打狗棍法', 0),
        ('黄药师', '123456abc', 1, '弹指神通', 0),
        ('欧阳锋', '123456abc', 1, '蛤蟆功', 0),
        ('梅超风', '123456abc', 1, '九阴白骨爪', 0),
        ('乔峰', '123456abc', 2, '降龙十八掌', 0),
        ('段誉', '123456abc', 2, '六脉神剑', 0),
        ('虚竹', '123456abc', 2, '天山六阳掌', 0),
        ('王语嫣', '123456abc', 2, '神仙姐姐', 0),
        ('令狐冲', '123456abc', 3, '独孤九剑', 0),
        ('任盈盈', '123456abc', 3, '弹琴', 0),
        ('岳不群', '123456abc', 3, '华山剑法', 0),
        ('东方不败', '123456abc', 3, '葵花宝典', 0),
        ('胡斐', '123456abc', 4, '胡家刀法', 0),
        ('苗若兰', '123456abc', 4, '黄衣', 0),
        ('程灵素', '123456abc', 4, '医术', 0),
        ('袁紫衣', '123456abc', 4, '六合拳', 0);
    
  • 视图:

  • from django.views.generic import View
    from django.http.response import JsonResponse
    
    # Create your views here.
    class BookListView(View):
        """
        图书列表
        """
        def get(self,request):
    
            return JsonResponse({'msg':'ok'})
    
  • URLconf

    • settings.py中:指定url配置

      ROOT_URLCONF = 'bookmanager.urls'
      
    • 项目中urls.py:只要不是admin/就匹配成功,包含到应用中的urls.py

      from django.urls import path,include
      from django.contrib import admin
      
      urlpatterns = [
           path('admin/', include(admin.site.urls)),
      
           # 只要不是‘admin/’就匹配成功,包含到应用中的urls.py
           path('', include('book.urls')),
       ]
      
  • 应用中urls.py:匹配books/成功就调用views中的BookListView视图,测试项目逻辑

    from django.urls import path
    from book import views
    urlpatterns = [
        path('books/',views.BookListView.as_view()),
    ]
    
  • 测试项目逻辑