Django基础-创建新项目,各文件作用

学习Django的前置知识:

  • python基本语法:需要掌握Python中的变量、循环、条件判断、函数等基本概念。
  • 面向对象编程(OOP) :Django的核心架构基于面向对象编程,许多功能(如模型和视图)依赖于类和方法的设计。因此,学习Python的面向对象部分是必需的 。你需要理解以下概念:
    • 类与对象:如何定义和使用类。
    • 继承多态:如何通过继承实现代码复用和扩展。
    • 封装:如何隐藏实现细节,提供接口。

2. HTML/CSS基础

  • HTML:了解基本的页面结构,标签和属性。
  • CSS:用于样式化网页,可以帮助你在Django项目中自定义前端页面的展示。

3. JavaScript基础

  • 基础语法:用于实现页面上的交互和动态效果。
  • AJAX:可以在不刷新页面的情况下与服务器进行通信,常用于Django中的异步操作。

4. 数据库基础

  • SQL:了解基本的SQL语法,如何进行查询、插入、更新和删除操作。
  • Django使用ORM(对象关系映射)与数据库进行交互,虽然可以不直接写SQL,但了解数据库如何工作很有帮助。

5. HTTP/网络基础

  • HTTP协议:理解基本的GET、POST请求以及HTTP状态码。
  • Django作为一个Web框架,处理HTTP请求和响应是核心功能之一。

1. 项目结构:

首先,确保你将项目文件按Django的标准结构进行组织。Django项目的基本结构如下:

myproject/
    ├── myproject/
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   ├── asgi.py
    │   └── wsgi.py
    ├── myapp/
    │   ├── migrations/
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── views.py
    │   ├── urls.py
    │   └── templates/
    │       ├── about.html
    │       ├── getinformation.html
    │       ├── index.html
    │       ├── welcome.html
    ├── static/
    │   ├── css/
    │   ├── js/
    │   └── images/
    ├── manage.py

2. 在cmd中创建Django项目:

首先,在要创建项目的文件夹运行cmd,输入下面这行命令,创建一个名为myproject的项目文件夹。

django-admin startproject myproject

接着输入下面两行命令,在刚刚创建的项目中创建一个新的Django应用:

cd myproject

python manage.py startapp myapp

2. 1 .在pycharm中创建Django项目:

点这个创建新项目,正常来说,第一次创建的话,pycharm会自动帮你下载Django包到你的本地python环境中。当然也可以手动用pip安装。

3. Django配置:

编辑 myproject/settings.py 文件,将 myapp 添加到 INSTALLED_APPS 列表中,并设置静态文件和模板文件的路径:

python 复制代码
INSTALLED_APPS = [
    ...
    'myapp',
]

# 添加静态文件配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / 'static']

# 添加模板文件配置
TEMPLATES = [
    {
        ...
        'DIRS': [BASE_DIR / 'myapp/templates'],
        ...
    },
]

一些文件和目录的名字是 Django 框架自动生成的,并且在项目初始化或运行时依赖这些名字:

  • manage.py : 项目根目录下的 manage.py 文件是 Django 项目的入口,用于执行各种 Django 管理命令,如启动服务器、创建数据库迁移等。文件名不能更改。

  • __init__.py: 每个 Python 包(目录)下都需要包含这个文件,它可以是空的,但必须存在。它告诉 Python 该目录是一个包。

  • settings.py : 这个文件位于项目的配置文件夹中,是 Django 项目的配置文件。虽然你可以更改它的名字,但需要在 manage.pywsgi.py 等文件中同步更改 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_settings>")

  • urls.py : 每个应用通常都有自己的 urls.py 文件,用于定义 URL 路由。如果更改名字,Django 将不会自动加载它。每个应用的 urls.py 文件名应保持不变。

  • wsgi.pyasgi.py: 这两个文件分别用于 WSGI 和 ASGI 服务器部署。如果你要使用 Django 进行服务器部署,默认名字应保持不变,除非你知道如何手动配置这些文件。

4.各个部分功能

1. 项目根目录 (myproject/)

这个根目录包含了项目的全局文件,包括 manage.py 和一个与项目同名的子目录。

manage.py

manage.py 是 Django 的命令行工具,用于执行管理任务,例如运行开发服务器、迁移数据库等。你可以通过运行命令 python manage.py runserver 来启动项目。

python 复制代码
#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable?"
        ) from exc
    execute_from_command_line(sys.argv)

2. 项目子目录 (myproject/)

这个子目录包含项目的全局配置文件,它的名字通常与项目名相同。它包含 Django 项目的核心配置文件。

__init__.py

这是一个空文件,表明 myproject/ 是一个 Python 包。

settings.py

这是 Django 项目的配置文件,包含数据库设置、静态文件设置、应用程序注册、时区、语言等信息。你会经常修改这个文件。

python 复制代码
# settings.py

# 项目安装的应用程序
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',  # 注册自定义应用
]

# 中间件
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',
]

# 数据库设置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# 静态文件配置
STATIC_URL = '/static/'
urls.py

定义了项目的全局 URL 路由。通过此文件将用户的请求导向不同的应用或视图函数。

python 复制代码
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('myapp.urls')),  # 将主应用的路由包含进来
]
asgi.py

配置项目的 ASGI 入口点,通常用于异步服务器和 WebSocket。

python 复制代码
import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()
wsgi.py

配置项目的 WSGI 入口点,通常用于生产环境的部署。

python 复制代码
import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_wsgi_application()

3. 应用目录 (myapp/)

这是我们创建的自定义应用,每个应用都是一个功能模块。Django 项目可以包含多个应用,每个应用负责一个独立的功能。

migrations/

这个文件夹保存数据库迁移文件,Django 会在模型变化时自动生成这些文件。

admin.py

用于注册模型,使它们可以在 Django 管理后台进行管理。

python 复制代码
from django.contrib import admin
from .models import UserInfo

admin.site.register(UserInfo)  # 将 UserInfo 模型注册到管理后台
apps.py

用于配置应用程序,定义应用的名称等。

python 复制代码
from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'
models.py

模型文件,定义数据库结构。每个模型类映射到数据库中的一张表。

models.py 文件中,虽然模型的类名和字段名称可以自定义,但有些约定不能更改:

  • 类继承自 models.Model : 你的模型类必须继承自 django.db.models.Model
python 复制代码
from django.db import models

class UserInfo(models.Model):
    name = models.CharField(max_length=100)
    student_id = models.CharField(max_length=50, unique=True)
    class_name = models.CharField(max_length=50)
    email = models.EmailField()
    phone = models.CharField(max_length=15)
    message = models.TextField()

    def __str__(self):
        return self.name
  • models.Model 是 Django 的模型基类,不能省略或替换。

  • 字段类型 : Django 提供了一系列字段类型(CharField, IntegerField, EmailField 等),这些类型不能任意修改。如果你要保存字符串、整数等数据,必须使用 Django 提供的字段类型。

  • Meta : Meta 类是模型的内部类,可以用于定义一些模型的元数据,如数据库表名、排序等。虽然类名 Meta 可以自定义,但这是 Django 的约定,建议不要修改。如果你要定义元选项,必须用 Meta

python 复制代码
class UserInfo(models.Model):
    name = models.CharField(max_length=100)
    
    class Meta:
        db_table = 'user_info_table'
views.py

视图文件,处理请求并返回响应。视图可以直接返回 HTML 或通过模板返回动态内容。

views.py 中视图函数名或类名可以自定义,但某些地方的名字必须符合 Django 的约定:

  • request 参数 : 无论是基于函数的视图还是基于类的视图,第一个参数必须是 request,它是 Django 自动传递的 HttpRequest 对象。不能修改这个参数名,否则视图函数无法正确接收请求数据。
python 复制代码
from django.shortcuts import render
from .models import UserInfo

def index(request):
    return render(request, 'myapp/index.html')

def submit_info(request):
    if request.method == 'POST':
        name = request.POST['name']
        student_id = request.POST['student_id']
        class_name = request.POST['class_name']
        email = request.POST['email']
        phone = request.POST['phone']
        message = request.POST['message']
        
        UserInfo.objects.create(
            name=name, student_id=student_id, class_name=class_name,
            email=email, phone=phone, message=message
        )
        return render(request, 'myapp/success.html')
    return render(request, 'myapp/index.html')
视图类继承自 View 或其子类 : 如果使用基于类的视图,必须继承 django.views.View 或其子类。类名可以自定义,但继承必须正确:
python 复制代码
from django.views import View

class MyView(View):
    def get(self, request):
        return HttpResponse('Hello, World!')
forms.py

用于定义表单字段和验证规则,特别适用于复杂的表单处理。

表单的文件名可以是任意的,但表单类必须继承自 forms.Formforms.ModelForm。此外,表单字段必须使用 Django 提供的字段类型。

  • 表单类继承自 forms.Formforms.ModelForm:

python 复制代码
from django import forms

class UserInfoForm(forms.ModelForm):
    class Meta:
        model = UserInfo
        fields = ['name', 'email']

Meta : 与模型类似,如果使用 ModelFormMeta 类的名称不可更改。

urls.py

定义应用的 URL 路由。

  • urlpatterns 列表 : 这个列表用于存放 URL 模式与视图函数的对应关系,名字必须为 urlpatterns,不能修改,否则 Django 无法找到你的路由。

  • path()re_path() : 路由必须使用 Django 提供的 path()re_path() 函数来定义,不能使用其他方式。

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('submit-info/', views.submit_info, name='submit_info'),
]
templates/

存放 HTML 模板的文件夹。Django 将根据模板生成动态页面。

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>信息填写</title>
</head>
<body>
    <h1>填写您的信息</h1>
    <form method="POST" action="{% url 'submit_info' %}">
        {% csrf_token %}
        姓名: <input type="text" name="name"><br>
        学号: <input type="text" name="student_id"><br>
        班级: <input type="text" name="class_name"><br>
        邮箱: <input type="email" name="email"><br>
        电话: <input type="text" name="phone"><br>
        留言: <textarea name="message"></textarea><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

4. static/ 目录

static/ 目录用于存放静态文件,例如 CSS、JavaScript 和图片等。静态文件在生产环境中并不会动态生成,而是直接提供给用户的。

css/

这里存放项目的 CSS 文件,用于定义页面的样式。

示例文件:

style.css

css 复制代码
body {
    font-family: Arial, sans-serif;
    background-color: #f9f9f9;
}

h1 {
    color: #333;
}

form {
    margin: 20px 0;
}
js/

这里存放 JavaScript 文件,用于增强网页的交互性。

示例文件:

script.js

css 复制代码
document.addEventListener("DOMContentLoaded", function() {
    alert("页面加载完毕!");
});

images/

这个文件夹用于存储图片文件,例如 logo、背景图片等。

5. migrations/ 目录

migrations/ 目录是 Django 用来记录模型变更的地方。当你对数据库模型进行修改后,需要生成迁移文件并应用到数据库中。

迁移文件会自动生成,用于保持数据库表结构与模型一致。

示例迁移文件:

0001_initial.py

python 复制代码
from django.db import migrations, models

class Migration(migrations.Migration):
    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name='UserInfo',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('student_id', models.CharField(max_length=50, unique=True)),
                ('class_name', models.CharField(max_length=50)),
                ('email', models.EmailField(max_length=254)),
                ('phone', models.CharField(max_length=15)),
                ('message', models.TextField()),
            ],
        ),
    ]

6. templates/ 目录

templates/ 目录用于存放模板文件。在 Django 中,模板系统允许开发者将 HTML 代码与动态内容结合,通过视图函数来生成网页。

通常,templates/ 目录是按应用分为多个子目录的。例如,在 myapp/ 应用中,模板文件位于 myapp/templates/myapp/ 下。

index.html
python 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>信息填写</title>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
    <h1>填写您的信息</h1>
    <form method="POST" action="{% url 'submit_info' %}">
        {% csrf_token %}
        姓名: <input type="text" name="name"><br>
        学号: <input type="text" name="student_id"><br>
        班级: <input type="text" name="class_name"><br>
        邮箱: <input type="email" name="email"><br>
        电话: <input type="text" name="phone"><br>
        留言: <textarea name="message"></textarea><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

7. tests.py

这是 Django 项目中的测试文件,用于编写自动化测试。你可以在这里编写测试来验证应用的功能是否正常工作。

示例代码:

python 复制代码
from django.test import TestCase
from .models import UserInfo

class UserInfoTest(TestCase):
    def setUp(self):
        UserInfo.objects.create(
            name="张三", student_id="12345", class_name="2024级", 
            email="zhangsan@example.com", phone="123456789", message="测试留言"
        )

    def test_user_info(self):
        user = UserInfo.objects.get(student_id="12345")
        self.assertEqual(user.name, "张三")
        self.assertEqual(user.email, "zhangsan@example.com")

8. forms.py (可选)

forms.py 用于定义 Django 表单类,便于处理用户提交的数据。虽然可以直接在视图中手动处理表单数据,但通过表单类可以更好地组织代码并进行自动验证。

python 复制代码
from django import forms

class UserInfoForm(forms.Form):
    name = forms.CharField(label='姓名', max_length=100)
    student_id = forms.CharField(label='学号', max_length=50)
    class_name = forms.CharField(label='班级', max_length=50)
    email = forms.EmailField(label='邮箱')
    phone = forms.CharField(label='电话', max_length=15)
    message = forms.CharField(label='留言', widget=forms.Textarea)

9. admin.py

用于将模型注册到 Django 管理后台,以便通过 Django 的默认管理界面进行管理。每个注册的模型可以在后台进行增删改查等操作。

admin.site.register() : 用于将模型注册到 Django 的管理后台,admin.site 是 Django 内置的后台站点管理器,必须保持不变。

示例代码:

python 复制代码
from django.contrib import admin
from .models import UserInfo

# 注册模型到管理后台
admin.site.register(UserInfo)

10. apps.py

这个文件用于定义 Django 应用程序的配置信息。每个 Django 应用都可以有一个 AppConfig 类,负责定义应用的元数据。

示例代码:

python 复制代码
from django.apps import AppConfig

class MyappConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'myapp'

11. urls.py

每个应用可以有自己独立的 URL 路由配置文件,这里定义了视图函数和 URL 的映射关系。项目的全局 urls.py 文件通常会包含应用的 urls.py

示例代码:

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('submit-info/', views.submit_info, name='submit_info'),
]

中间件 (MIDDLEWARE)

settings.py 中,MIDDLEWARE 是一个列表,不能更改其名称。并且,如果你使用 Django 内置功能如认证或消息系统,某些中间件必须存在,例如:

  • django.contrib.sessions.middleware.SessionMiddleware : 必须存在于 MIDDLEWARE 中,否则会导致会话处理失败。
  • django.contrib.auth.middleware.AuthenticationMiddleware: 如果要使用认证系统,此中间件必须添加。

通过以上的文件结构,Django 项目实现了前后端分离的模块化开发,每个部分职责清晰,便于管理和扩展。每个应用的目录也独立组织,方便大规模项目的维护。

相关推荐
良许Linux4 分钟前
0.96寸OLED显示屏详解
linux·服务器·后端·互联网
求知若饥16 分钟前
NestJS 项目实战-权限管理系统开发(六)
后端·node.js·nestjs
qq_5290252919 分钟前
Torch.gather
python·深度学习·机器学习
数据小爬虫@19 分钟前
如何高效利用Python爬虫按关键字搜索苏宁商品
开发语言·爬虫·python
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
終不似少年遊*1 小时前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
gb42152871 小时前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶1 小时前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Python之栈1 小时前
【无标题】
数据库·python·mysql