首页
/ Django入门教程:从零开始构建Web应用

Django入门教程:从零开始构建Web应用

2025-07-01 08:28:40作者:贡沫苏Truman

Django作为Python生态中最流行的Web框架之一,以其"开箱即用"的特性深受开发者喜爱。本文将通过一个实际项目案例,带你从零开始学习Django的核心概念和开发流程。

环境准备与项目创建

在开始Django项目前,我们需要确保Python环境已正确配置。推荐使用虚拟环境隔离项目依赖:

# 创建虚拟环境
python -m venv myenv
source myenv/bin/activate

# 安装Django
pip install django==1.10.2

创建Django项目的基本命令非常简单:

django-admin startproject mysite

这会在当前目录下生成一个名为mysite的项目目录,包含以下核心文件:

mysite/
├── manage.py         # 项目管理脚本
└── mysite            # 项目主目录
    ├── __init__.py
    ├── settings.py   # 项目配置
    ├── urls.py       # URL路由配置
    └── wsgi.py       # WSGI应用入口

启动开发服务器:

python manage.py runserver 0.0.0.0:8000

创建第一个Django应用

在Django中,一个项目(project)可以包含多个应用(app)。让我们创建一个名为polls的应用:

python manage.py startapp polls

创建完成后,需要在项目的settings.py中注册这个应用:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    # 其他默认应用...
]

模型(Model)设计

Django的模型层(Model)负责与数据库交互。我们以新闻网站为例,创建记者(Reporter)和文章(Article)两个模型:

# polls/models.py
from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
    
    def __str__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    
    def __str__(self):
        return self.headline

创建模型迁移文件并同步到数据库:

python manage.py makemigrations polls
python manage.py migrate

Django Shell操作

Django提供了交互式shell,方便我们测试模型操作:

python manage.py shell

在shell中可以执行各种数据库操作:

from polls.models import Reporter, Article
from django.utils import timezone

# 创建记者
r = Reporter(full_name="张三")
r.save()

# 创建文章
a = Article(
    pub_date=timezone.now(),
    headline="Django入门教程",
    content="这是一篇关于Django入门的教程...",
    reporter=r
)
a.save()

# 查询操作
Reporter.objects.all()
Article.objects.filter(headline__startswith="Django")

管理后台配置

Django自带功能强大的管理后台,首先创建超级用户:

python manage.py createsuperuser

然后注册模型到admin界面:

# polls/admin.py
from django.contrib import admin
from .models import Reporter, Article

admin.site.register(Reporter)
admin.site.register(Article)

访问http://localhost:8000/admin即可看到管理后台界面。

视图(View)与URL配置

视图负责处理业务逻辑,URL配置决定哪个请求由哪个视图处理。

首先配置项目的主URL:

# mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

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

然后在应用(polls)中创建URL配置:

# polls/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<article_id>[0-9]+)/$', views.detail, name='detail'),
]

对应的视图函数:

# polls/views.py
from django.shortcuts import render, get_object_or_404
from .models import Article

def index(request):
    latest_articles = Article.objects.order_by('-pub_date')[:5]
    context = {'latest_articles': latest_articles}
    return render(request, 'polls/index.html', context)

def detail(request, article_id):
    article = get_object_or_404(Article, pk=article_id)
    return render(request, 'polls/detail.html', {'article': article})

模板(Template)系统

Django使用模板系统分离业务逻辑和展示逻辑。首先在项目设置中配置模板路径:

# mysite/settings.py
TEMPLATES = [
    {
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        # 其他配置...
    },
]

创建基础模板:

<!-- templates/base.html -->
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

创建文章列表模板:

<!-- templates/polls/index.html -->
{% extends "base.html" %}

{% block title %}最新文章{% endblock %}

{% block content %}
{% if latest_articles %}
<ul>
    {% for article in latest_articles %}
    <li>
        <a href="{% url 'polls:detail' article.id %}">
            {{ article.headline }}
        </a>
    </li>
    {% endfor %}
</ul>
{% else %}
<p>暂无文章</p>
{% endif %}
{% endblock %}

Django工作流程总结

  1. 请求到达:用户访问URL,Django根据URL配置找到对应的视图函数
  2. 业务处理:视图函数处理请求,可能需要查询数据库
  3. 模板渲染:视图将数据传递给模板进行渲染
  4. 响应返回:渲染后的HTML作为响应返回给用户

这种模式被称为MTV模式(Model-Template-View),是Django的核心设计理念。

进阶功能

表单处理

Django提供了强大的表单处理功能:

# polls/forms.py
from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['headline', 'content', 'reporter']

静态文件管理

settings.py中配置静态文件:

STATIC_URL = '/static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

用户认证

Django内置了完整的用户认证系统:

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # 登录成功...

常见问题解决

  1. 数据库连接问题:确保已安装数据库驱动(sqlite3, psycopg2等)
  2. 时区设置:在settings.py中正确配置TIME_ZONE
  3. 静态文件404:开发时需配置STATICFILES_DIRS,生产环境需配置Web服务器

通过本教程,你应该已经掌握了Django的基础开发流程。Django的强大之处在于其"电池全包"的理念,几乎所有的Web开发需求都能找到对应的解决方案。继续深入探索Django的各个组件,你将能够构建更加复杂的Web应用。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
869
514
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
328
377
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
333
1.09 K
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
28
0
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
kernelkernel
deepin linux kernel
C
22
5
WxJavaWxJava
微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
829
22
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
601
58