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
列表中,并设置静态文件和模板文件的路径:
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.py
和wsgi.py
等文件中同步更改os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<your_settings>")
。 -
urls.py
: 每个应用通常都有自己的urls.py
文件,用于定义 URL 路由。如果更改名字,Django 将不会自动加载它。每个应用的urls.py
文件名应保持不变。 -
wsgi.py
和asgi.py
: 这两个文件分别用于 WSGI 和 ASGI 服务器部署。如果你要使用 Django 进行服务器部署,默认名字应保持不变,除非你知道如何手动配置这些文件。
4.各个部分功能
1. 项目根目录 (myproject/
)
这个根目录包含了项目的全局文件,包括 manage.py
和一个与项目同名的子目录。
manage.py
manage.py
是 Django 的命令行工具,用于执行管理任务,例如运行开发服务器、迁移数据库等。你可以通过运行命令 python manage.py runserver
来启动项目。
#!/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 项目的配置文件,包含数据库设置、静态文件设置、应用程序注册、时区、语言等信息。你会经常修改这个文件。
# 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 路由。通过此文件将用户的请求导向不同的应用或视图函数。
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。
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 入口点,通常用于生产环境的部署。
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 管理后台进行管理。
from django.contrib import admin
from .models import UserInfo
admin.site.register(UserInfo) # 将 UserInfo 模型注册到管理后台
apps.py
用于配置应用程序,定义应用的名称等。
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
。
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
: -
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
对象。不能修改这个参数名,否则视图函数无法正确接收请求数据。
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
或其子类。类名可以自定义,但继承必须正确:
from django.views import View
class MyView(View):
def get(self, request):
return HttpResponse('Hello, World!')
forms.py
用于定义表单字段和验证规则,特别适用于复杂的表单处理。
表单的文件名可以是任意的,但表单类必须继承自 forms.Form
或 forms.ModelForm
。此外,表单字段必须使用 Django 提供的字段类型。
-
表单类继承自
forms.Form
或forms.ModelForm
: -
from django import forms class UserInfoForm(forms.ModelForm): class Meta: model = UserInfo fields = ['name', 'email']
Meta
类: 与模型类似,如果使用ModelForm
,Meta
类的名称不可更改。
urls.py
定义应用的 URL 路由。
-
urlpatterns
列表: 这个列表用于存放 URL 模式与视图函数的对应关系,名字必须为urlpatterns
,不能修改,否则 Django 无法找到你的路由。 -
path()
和re_path()
: 路由必须使用 Django 提供的path()
或re_path()
函数来定义,不能使用其他方式。
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 将根据模板生成动态页面。
<!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
body {
font-family: Arial, sans-serif;
background-color: #f9f9f9;
}
h1 {
color: #333;
}
form {
margin: 20px 0;
}
js/
这里存放 JavaScript 文件,用于增强网页的交互性。
示例文件:
script.js
document.addEventListener("DOMContentLoaded", function() {
alert("页面加载完毕!");
});
images/
这个文件夹用于存储图片文件,例如 logo、背景图片等。
5. migrations/
目录
migrations/
目录是 Django 用来记录模型变更的地方。当你对数据库模型进行修改后,需要生成迁移文件并应用到数据库中。
迁移文件会自动生成,用于保持数据库表结构与模型一致。
示例迁移文件:
0001_initial.py
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
<!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 项目中的测试文件,用于编写自动化测试。你可以在这里编写测试来验证应用的功能是否正常工作。
示例代码:
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 表单类,便于处理用户提交的数据。虽然可以直接在视图中手动处理表单数据,但通过表单类可以更好地组织代码并进行自动验证。
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 内置的后台站点管理器,必须保持不变。
示例代码:
from django.contrib import admin
from .models import UserInfo
# 注册模型到管理后台
admin.site.register(UserInfo)
10. apps.py
这个文件用于定义 Django 应用程序的配置信息。每个 Django 应用都可以有一个 AppConfig
类,负责定义应用的元数据。
示例代码:
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
。
示例代码:
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 项目实现了前后端分离的模块化开发,每个部分职责清晰,便于管理和扩展。每个应用的目录也独立组织,方便大规模项目的维护。