Django创建项目的方法

一,安装Django并初始化

  1. 在合适的目录创建一个项目
  2. 打开cmd终端进入上一步创建的目录下
  3. 输入命令
django -admin startproject project
  1. 目录层级说明:
  • manage.py,一个命令行工具,可以使用多种方式对Django项目进行交互
  • project\init.py,一个空文件,它告诉Python这个目录应该看做一个Python包
  • project\settings.py,项目的配置文件
  • project\urls.py,项目的URL声明
  • project\wsgi.py,项目与WSGI兼容的web服务器入口

二,配置数据库

  1. 数据库配置:Django默认使用SQLite数据库,
  2. 在project文件夹下的init.py 文件中添加以下内容
import pymysql
pymysql.install_as_MySQLdb()
  1. 在settings文件中查看配置项,数据库做如下修改
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'student', # 数据库名称
        'HOST':'192.168.159.6', # IP地址
        'PORT':'3306', # 端口号
        'USER':'root', # 用户名
        'PASSWORD':'123456', # 密码

    }
}

三,创建应用

  1. 应用介绍:一个项目中可以创建多个应用,每个应用只处理一种业务逻辑
  2. 创建应用:
    1. 打开cmd窗口,进入project目录下
    2. 执行以下命令
    python manage.py startapp MyApp
    
  3. MyApp目录说明:
    1. admin.py,站点配置
    2. models.py,模型
    3. views.py,视图
  4. 激活应用:
    1. project目录下,settings.py 文件中,将MyApp加入到INSTALLED_APPS选项中,效果如下
	INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'MyApp'
]

四,定义模型

  1. 模型介绍:数据库中有几张表,就需要定义几个模型;模型中的每个属性,对应该模型对照表中的每个字段
  2. 模型中属性介绍,详见
https://blog.csdn.net/zhuan_long/article/details/114022089
  1. 定义模型:在models.py文件中定义模型,代码如下
from django.db import models
class Grade(models.Model):
    gradeName = models.CharField(max_length=64)
    startTime = models.DateTimeField()
    girlNum = models.IntegerField(max_length=64)
    boyNum = models.IntegerField(max_length=64)
    isDelete = models.BooleanField(default=False)
    def __str__(self):
        return self.gradeName

class Student(models.Model):
    studentName = models.CharField(max_length=64)
    studentAge = models.IntegerField(max_length=64)
    #grade = models.IntegerField(max_length=64)
    # 关联外键
    grade = models.ForeignKey("Grade",on_delete=models.DO_NOTHING) # 删除关联数据,什么也不做
    isDelete = models.BooleanField(default=False)
    # 不需要定义主键,在生成时会自动增加
    def __str__(self):
        return self.studentName
  1. 数据表生成迁移文件:打开cmd窗口,进入project目录下,执行以下命令
python manage.py makemigrations

在migrations目录下生成一个迁移文件,此时数据库中还没有数据表
5. 进行文件迁移:打开cmd窗口,进入project目录下,执行以下命令,相当于执行SQL语句创建数据表

python manage.py migrate

五,启动服务器

  1. 启动服务器的语句:打开cmd窗口,进入project目录下,执行以下命令
python manage.py runserver ip:port

六,Admin站点管理

  1. 配置Admin应用:在settings.py文件中的INSTALLED_APPS中添加"django.contrib.admin",默认已添加
  2. 添加管理员账号:打开cmd窗口,进入project目录下,执行以下命令
python manage.py createsuperuser
  1. Admin站点汉化:修改settings.py文件
LANGUAGE_CODE = "zh-Hans"
TIME_ZONE = "Asia/Shanghai"
  1. 修改MyApp/admin.py文件
from django.contrib import admin

# Register your models here.
from .models import Grade,Student

# 以下功能实现创建班级时同步创建2个学生
class StudentsInfo(admin.TabularInline): # admin.StackedInline 也可以,创建时样式不同
    model = Student
    extra = 2


# 注册
@admin.register(Grade) # 使用装饰器注册,后面不需要额外注册语句
class GradesAdmin(admin.ModelAdmin):
    # 以下功能实现创建班级时同步创建2个学生
    inlines = [StudentsInfo]

    # 列表页属性
    list_display = ["gradeName","startTime","girlNum","boyNum","isDelete"] # 显示字段
    list_filter = ["startTime"] # 过滤字段
    search_fields = ["startTime"] # 搜索字段
    list_per_page = 5 # 分页字段
    # 添加,修改页属性
    # fields = ["girlNum","boyNum","gradeName","startTime","isDelete"] # 可以规定属性的先后顺序

    fieldsets = [
        ("num",{"fields":["girlNum","boyNum"]}),
        ("base",{"fields":["gradeName","startTime","isDelete"]})
                 ] # 分组并规定先后顺序
    # fields 与 fieldsets 不能同时生效

@admin.register(Student) # 使用装饰器注册,后面不需要额外注册语句
class StudentAdmin(admin.ModelAdmin):
    # 数据库中isDelete是布尔值,使用此方法可以将符号转换为中文
    def IsDelete(self):
        if self.isDelete == True:
            return "已删除"
        else:
            return "未删除"
    def StudentGender(self):
        if self.studentGender == True:
            return "男"
        else:
            return "女"
    # 设置页面列的名称
    StudentGender.short_description = "性别"
    IsDelete.short_description = "是否删除"

    # 执行动作的位置
    actions_on_top = False
    actions_on_bottom = True

    # 列表页属性
    list_display = ["studentName", StudentGender,"studentAge", IsDelete,"grade"]  # 显示字段
    list_filter = ["studentName"]  # 过滤字段
    search_fields = ["studentName"]  # 搜索字段
    list_per_page = 5  # 分页字段
    fields = ["studentName","studentGender","studentAge","isDelete","grade"] # 可以规定属性的先后顺序

#admin.site.register(Grade,GradesAdmin)
#admin.site.register(Student,StudentAdmin)

七,视图的介绍

  1. 概念:在Django中,视图是对web请求进行回应,视图是一个Python函数,在 \Django\MyDjango\project\MyApp\urls.py 中定义

  2. 配置URL \Django\MyDjango\project\MyApp\urls.py 添加以下内容

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)/(\d+)$',views.detail)
]

\Django\MyDjango\project\project\urls.py 添加以下内容

from django.contrib import admin
from django.urls import path,include
from django.conf.urls import url


urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^',include('MyApp.urls')),
]

  1. 定义返回结果:\Django\MyDjango\project\MyApp\views.py
from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
def index(request):
    return HttpResponse("Sunck is a good man")
def detail(request,num1,num2):
    return HttpResponse("detail - %s - %s"%(num1,num2))
  1. 测试验证:重新启动服务,使用浏览器访问127.0.0.1:8000/
    在这里插入图片描述
    在这里插入图片描述

八,模板

  1. 添加模板目录:目录下的settings.py文件修改TEMPLATES部分内容:
    \Django\MyDjango\project\project\settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")], # 添加模板的目录
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
  1. 目录下创建html文件
  • \Django\MyDjango\project\templates\MyApp\grades.html
    grades.html 文件中添加内容
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级信息</title>
</head>
<body>
    <h1>班级信息列表</h1>
    <ul>
        <li>
            <a href="#">班级名称</a>
        </li>
        <!--[python04,python05,python06]-->
        {%for gradeHtml in gradesHtml%}
        <li>
            <a href="{
   
   {gradeHtml.id}}">{
   
   {gradeHtml.gradeName}}</a>
        </li>
        {%endfor%}
    </ul>
</body>
</html>
  • \Django\MyDjango\project\templates\MyApp\students.html
    students.html 文件中添加内容
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>学生信息</title>
</head>
<body>
    <h1>学生信息列表</h1>
    <ul>
        <li>
            <a href="#">学生姓名--学生年龄--学生班级</a>
        </li>
        <!--[python04,python05,python06]-->
        {%for studentHtml in studentsHtml%}
        <li>

            <a href="#">{
   
   {studentHtml.studentName}}--{
   
   {studentHtml.studentAge}}--{
   
   {studentHtml.grade_id}}</a>
        </li>
        {%endfor%}
    </ul>
</body>
</h tml>
  1. 项目的 urls.py 文件中增加路由信息
    \Django\MyDjango\project\MyApp\urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^$',views.index),
    url(r'^(\d+)/(\d+)$',views.detail),
    url(r"^grades/$",views.Grades),
    url(r"^students/$",views.Students)
]
  1. 视图文件中指定页面路径:\Django\MyDjango\project\MyApp\views.py 添加
from .models import Grade
def Grades(requset):
    # 模板中取数据
    GradesList = Grade.objects.all()
    # 将数据传递给模板
    return render(requset,'MyApp/grades.html',{"gradesHtml":GradesList})

from .models import Student
def Students(request):
    StudentList = Student.objects.all()
    return render(request,"MyApp/students.html",{"studentsHtml":StudentList})
  1. 启动服务,重新访问127.0.0.1:8000/grades,127.0.0.1:8000/students即可看到页面内容
    在这里插入图片描述
    在这里插入图片描述

  2. 班级与学生相关联
    \Django\MyDjango\project\MyApp\views.py 中增加以下内容

def GradesId(request,Num):
    grade = Grade.objects.get(pk = Num)
    StudentList = grade.student_set.all()
    return render(request,"MyApp/students.html",{"studentsHtml":StudentList})
  1. 项目URL文件
    \Django\MyDjango\project\MyApp\urls.py 中增加以下内容
url(r"^grades/(\d+)$",views.GradesId)
  1. 重启服务,即可实现点击班级链接,跳转到此班级的学生列表中

九,数据库表改变

  1. 如果数据库,表结构有改变,需要做如下处理
    1. 在settings.py 中修改数据库信息
    2. 对应项目里删除迁移文件
    3. 数据库中创建项目数据库
    4. 生成迁移文件
    5. 执行迁移
  2. 迁移文件位置,如下图所示
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhuan_long/article/details/113790601