Loading

Django 项目开发整体步骤(0 开始)+进阶

Django 项目开发整体步骤-基础版

这里从 0 到 1 演示了如何使用 Django 框架。
跟着教程操作,你可以得到一个完整流程:在后台添加商品或订单数据,然后前端页面能够展示这些数据,并支持简单的下单操作。

1. 环境准备

   - 安装 Python(推荐 3.10+)。
   - 创建虚拟环境(venv 或 virtualenv)。
# Linux / Mac
mkdir django_demo
cd django_demo

python3 -m venv myenv
source myenv/bin/activate

# Windows
python -m venv myenv
myenv\Scripts\activate
   - 安装 Django(pip install django)。
pip install django
python -m django --version #如果显示版本号,说明安装成功。
   - 安装其他可能用到的依赖(如数据库驱动 mysqlclient、psycopg2 等)。
pip install mysqlclient
pip install psycopg2-binary

2. 创建 Django 项目

   - 使用 django-admin startproject <project_name> 创建项目骨架。
django-admin startproject mysite #项目名叫 mysite

#执行后,目录结构如下:
django_demo/
└── mysite/
    ├── manage.py #管理项目的命令入口(运行、迁移、创建 app 等)
    ├── mysite/
    │   ├── __init__.py
    │   ├── asgi.py		#部署入口(生产环境使用)
    │   ├── settings.py #项目配置文件(数据库、应用、时区等)
    │   ├── urls.py 	#项目主路由配置
    │   └── wsgi.py 	#部署入口(生产环境使用)
   - 配置 settings.py(打开 mysite/settings.py)(数据库、时区、静态文件路径等)。
# 修改时区为中国
TIME_ZONE = 'Asia/Shanghai'

# 修改语言为中文
LANGUAGE_CODE = 'zh-hans'

# 允许所有本地访问
ALLOWED_HOSTS = ['*']
- 运行开发服务器
cd mysite
python manage.py runserver
python manage.py runserver 0.0.0.0:8000


#终端显示:
Starting development server at http://127.0.0.1:8000/

3. 创建应用(App)

   - 使用 python manage.py startapp <app_name> 创建应用。

Django 的项目通常由多个 App(应用) 组成,每个 App 都是一个独立的功能模块,例如:

goods/   商品模块(商品信息);    orders/  订单模块(下单、查看订单)
python manage.py startapp goods
python manage.py startapp orders

#目录结构会变成这样
mysite/
├── manage.py
├── mysite/
└── goods 和 orders/
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations/
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

   - 在 settings.py(mysite/settings.py) 中 INSTALLED_APPS  注册应用。

4. 设计模型(Models)

   - 根据需求设计数据库模型( goods/models.py)。
from django.db import models

class Goods(models.Model):
    name = models.CharField(max_length=100, verbose_name="商品名称")
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name="价格")
    stock = models.IntegerField(default=0, verbose_name="库存")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "商品"
        verbose_name_plural = "商品"
   
- 执行 python manage.py makemigrations 和 python manage.py migrate 创建表。
python manage.py makemigrations
python manage.py migrate

5. 管理后台(Admin)

   - 在 admin.py{} 注册模型,方便后台管理数据。  goods/admin.py
from django.contrib import admin
from .models import Goods

@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'price', 'stock', 'create_time')
   - 创建后台管理员账号:
python manage.py createsuperuser
 重启测试效果,通过界面添加商品和订单:【需要先按照第7步 配置一下路由】


6. 创建视图(Views)

   - 使用函数视图(Function-Based View)或类视图(Class-Based View)。
   - 编写业务逻辑,获取数据、处理请求。
    goods/views.py , Function-Based View 示例
from django.shortcuts import render
from .models import Goods

def goods_list(request):
    goods = Goods.objects.all()  # 查询所有商品
    return render(request, 'goods/list.html', {'goods': goods})

7. 配置 URL 路由(URLs)

   - 在项目主路由(mysite/urls.py)中引入应用路由。
from django.contrib import admin
from django.urls import path, include # include 本来没有的

urlpatterns = [
    path('admin/', admin.site.urls),
    path('goods/', include('goods.urls', namespace='goods')),   # 商品模块
]
   - 在应用内 urls.py 配置路由 ( goods/urls.py)。
from django.urls import path
from . import views

app_name = 'goods'  # 这一行非常关键,与主路由的namespace对应

urlpatterns = [
    path('', views.index, name='index'), #默认走这里
    path('goods_list/', views.goods_list, name='goods_list'),  # 商品列表页
    # 以后可以扩展其他路径,比如:
    # path('detail/<int:goods_id>/', views.goods_detail, name='goods_detail')
]

8. 模板和静态文件

   - 配置模板路径。
# 在 mysite/settings.py 中,找到 TEMPLATES 配置:
TEMPLATES = [
    {
        ...
        'DIRS': [BASE_DIR / "templates"],  # 新增这一行,统一存放模板文件
        ...
    },
]

#根目录执行,就是跟manage.py 同级的目录
mkdir templates
mkdir templates/goods
   - 编写 HTML 文件,配置静态文件(CSS、JS、图片等)。
    templates/goods/list.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>商品列表</title>
</head>
<body>
    <h1>商品列表</h1>
    <ul>
        {% for item in goods %}
            <li>
                {{ item.name }} - ¥{{ item.price }} - 库存: {{ item.stock }}
                <a href="{% url 'orders:create_order' item.id %}">购买</a>
            </li>
        {% empty %}
            <li>暂无商品</li>
        {% endfor %}
    </ul>
</body>
</html>
测试效果:


进阶

上面是一个数据库查询, 现在实现购买的逻辑。
前置操作

编写订单模型:orders/models.py:
from django.db import models
from goods.models import Goods

class Order(models.Model):
    goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品")
    quantity = models.PositiveIntegerField(default=1, verbose_name="数量")
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="总价")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="下单时间")

    def __str__(self):
        return f"订单 #{self.id} - {self.goods.name}"

    class Meta:
        verbose_name = "订单"
        verbose_name_plural = "订单"
生成并迁移数据库:
python manage.py makemigrations
python manage.py migrate

管理后台-订单的:
from django.contrib import admin
from .models import Order

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = ('id', 'goods', 'quantity', 'total_price', 'create_time')

视图-订单
from django.shortcuts import render, redirect
from .models import Order
from goods.models import Goods

#下单
def create_order(request, goods_id):
    goods = Goods.objects.get(id=goods_id)

    if request.method == "POST":
        quantity = int(request.POST.get('quantity', 1))
        total_price = goods.price * quantity
        Order.objects.create(goods=goods, quantity=quantity, total_price=total_price)
        return redirect('orders:order_list')  # 下单成功后跳转到订单列表

    return render(request, 'orders/create_order.html', {'goods': goods})
#查看订单
def order_list(request):
    orders = Order.objects.all()
    return render(request, 'orders/list.html', {'orders': orders})

路由-订单:
\mysite\urls.py
from django.contrib import admin
from django.urls import path, include 

urlpatterns = [
    path('admin/', admin.site.urls),
    path('goods/', include('goods.urls', namespace='goods')),   # 商品模块
    path('orders/', include('orders.urls', namespace='orders')), # 订单模块
]

orders/urls.py
from django.urls import path
from . import views

app_name = 'orders'

urlpatterns = [
    path('', views.order_list, name='order_list'),           # 订单列表页
    path('create/<int:goods_id>/', views.create_order, name='create_order'),  # 下单页
]

模板-订单列表
templates/orders/list.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>订单列表</title>
</head>
<body>
    <h1>订单列表</h1>
    <ul>
        {% for order in orders %}
            <li>
                订单 #{{ order.id }} - {{ order.goods.name }} - 数量: {{ order.quantity }} - 总价: ¥{{ order.total_price }}
            </li>
        {% empty %}
            <li>暂无订单</li>
        {% endfor %}
    </ul>
    <a href="{% url 'goods:goods_list' %}">返回商品列表</a>
</body>
</html>
下单模板
templates/orders/create_order.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>下单 - {{ goods.name }}</title>
</head>
<body>
    <h1>购买 {{ goods.name }}</h1>
    <form method="post">
        {% csrf_token %}
        数量: <input type="number" name="quantity" value="1" min="1" max="{{ goods.stock }}">
        <button type="submit">下单</button>
    </form>
    <a href="{% url 'goods:goods_list' %}">返回商品列表</a>
</body>
</html>
商品模板加一句:
<a href="{% url 'orders:create_order' item.id %}">购买</a>



9. 表单和数据验证

   - 使用 Django 的表单系统,替代手写的 HTML <form>。
   - 数据验证和错误提示。
9.1 创建订单表单类:orders/forms.py
from django import forms

class CreateOrderForm(forms.Form):
    quantity = forms.IntegerField(
        label="数量",
        min_value=1,
        widget=forms.NumberInput(attrs={'class': 'form-control', 'value': 1})
    )
9.2 在视图中使用表单:修改 orders/views.py 中的 create_order:
from django.shortcuts import render, redirect, get_object_or_404

from .models import Order
from goods.models import Goods
from .forms import CreateOrderForm


#下单
def create_order(request, goods_id):
    goods = get_object_or_404(Goods, id=goods_id)

    if request.method == "POST":
        form = CreateOrderForm(request.POST)
        if form.is_valid():
            quantity = form.cleaned_data['quantity']
            total_price = goods.price * quantity
            Order.objects.create(goods=goods, quantity=quantity, total_price=total_price)
            return redirect('orders:order_list')# 下单成功后跳转到订单列表
    else:
        form = CreateOrderForm()

    return render(request, 'orders/create_order.html', {'form': form, 'goods': goods})


#查看订单
def order_list(request):
    orders = Order.objects.all()
    return render(request, 'orders/list.html', {'orders': orders})
9.3 修改模板使用 Django 表单标签:更新 templates/orders/create_order.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>下单 - {{ goods.name }}</title>
</head>
<body>
    <h1>购买 {{ goods.name }}</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}   <!-- Django 自动渲染表单 -->
        <button type="submit">下单</button>
    </form>
    <a href="{% url 'goods:goods_list' %}">返回商品列表</a>
</body>
</html>

10. 用户认证与权限
    - 使用 Django 自带的 auth 系统。
    - 注册、登录、登出、权限管理。

11. 调试与测试
    - 使用 Django 内置开发服务器 python manage.py runserver 调试。
    - 编写单元测试(tests.py)。
    - 查看日志、处理报错。

12. 部署与上线
    - 配置 WSGI/ASGI(如 Gunicorn + Nginx)。
    - 配置数据库(生产环境 MySQL/PostgreSQL)。
    - 收集静态文件(python manage.py collectstatic)。
    - 配置安全设置(DEBUG=False、ALLOWED_HOSTS 等)。







posted @ 2025-11-03 22:58  LungGiyo  阅读(11)  评论(0)    收藏  举报