简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索

活动公告

通知:为庆祝网站一周年,将在5.1日与5.2日开放注册,具体信息请见后续详细公告
04-22 00:04
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

从零开始掌握Django新建项目完整指南 让初学者也能轻松搭建高效稳定的Web应用框架

SunJu_FaceMall

3万

主题

1158

科技点

3万

积分

白金月票

碾压王

积分
32796

立华奏

发表于 2025-8-22 15:00:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Django是一个由Python编写的高级Web框架,它遵循MVT(Model-View-Template)架构模式,旨在帮助开发者快速构建安全、可扩展的Web应用程序。作为初学者,掌握Django不仅能让你快速进入Web开发领域,还能为你提供一个强大的工具来构建从简单博客到复杂企业级应用的各种网站。

本指南将带您从零开始,逐步学习如何创建、配置和部署一个完整的Django项目。无论您是否有Web开发经验,通过本指南的详细步骤和实例,您将能够轻松搭建高效稳定的Web应用框架。

1. 环境准备

1.1 安装Python

Django是基于Python的框架,因此首先需要确保您的系统上安装了Python。Django 3.2及以上版本需要Python 3.6或更高版本。

在Windows上:

1. 访问Python官方网站(https://www.python.org/downloads/)
2. 下载最新版本的Python安装程序
3. 运行安装程序,确保勾选”Add Python to PATH”选项

在macOS上:
  1. # 使用Homebrew安装
  2. brew install python
  3. # 或者从官网下载安装程序
复制代码

在Linux上(以Ubuntu为例):
  1. sudo apt update
  2. sudo apt install python3 python3-pip
复制代码

验证Python安装:
  1. python --version
  2. # 或者
  3. python3 --version
复制代码

1.2 设置虚拟环境

虚拟环境可以为每个项目创建独立的Python环境,避免不同项目之间的依赖冲突。

安装虚拟环境工具:
  1. pip install virtualenv
复制代码

创建项目目录并设置虚拟环境:
  1. # 创建项目目录
  2. mkdir myproject
  3. cd myproject
  4. # 创建虚拟环境
  5. virtualenv venv
  6. # 激活虚拟环境
  7. # Windows:
  8. venv\Scripts\activate
  9. # macOS/Linux:
  10. source venv/bin/activate
复制代码

激活后,命令行前面会显示(venv),表示您现在处于虚拟环境中。

1.3 安装Django

在虚拟环境中安装Django:
  1. pip install django
复制代码

验证Django安装:
  1. django-admin --version
复制代码

2. 创建第一个Django项目

2.1 使用django-admin创建项目

Django提供了一个命令行工具django-admin来帮助创建项目骨架。
  1. django-admin startproject myproject
复制代码

这将在当前目录下创建一个名为myproject的目录,包含项目的基本结构。

2.2 项目结构解析

创建的项目结构如下:
  1. myproject/
  2.     manage.py
  3.     myproject/
  4.         __init__.py
  5.         settings.py
  6.         urls.py
  7.         asgi.py
  8.         wsgi.py
复制代码

各文件和目录的作用:

• manage.py:Django项目的命令行工具,用于执行各种管理任务。
• myproject/:项目的主包,包含项目的配置。__init__.py:空文件,告诉Python这是一个包。settings.py:项目的配置文件,包含所有设置。urls.py:URL声明,定义URL模式到视图的映射。asgi.py:ASGI兼容的Web服务器入口,用于部署。wsgi.py:WSGI兼容的Web服务器入口,用于部署。
• __init__.py:空文件,告诉Python这是一个包。
• settings.py:项目的配置文件,包含所有设置。
• urls.py:URL声明,定义URL模式到视图的映射。
• asgi.py:ASGI兼容的Web服务器入口,用于部署。
• wsgi.py:WSGI兼容的Web服务器入口,用于部署。

• __init__.py:空文件,告诉Python这是一个包。
• settings.py:项目的配置文件,包含所有设置。
• urls.py:URL声明,定义URL模式到视图的映射。
• asgi.py:ASGI兼容的Web服务器入口,用于部署。
• wsgi.py:WSGI兼容的Web服务器入口,用于部署。

2.3 开发服务器

Django自带一个轻量级的开发服务器,便于开发和测试。
  1. cd myproject
  2. python manage.py runserver
复制代码

默认情况下,服务器将在本地8000端口运行。访问http://127.0.0.1:8000/,如果看到Django的欢迎页面,说明项目已成功创建。

3. 创建Django应用

在Django中,一个项目可以包含多个应用。应用是Web应用程序的一个功能模块,例如博客、用户系统、支付系统等。

3.1 创建应用

使用startapp命令创建应用:
  1. python manage.py startapp blog
复制代码

这将在项目目录下创建一个名为blog的应用,结构如下:
  1. blog/
  2.     __init__.py
  3.     admin.py
  4.     apps.py
  5.     migrations/
  6.         __init__.py
  7.     models.py
  8.     tests.py
  9.     views.py
复制代码

3.2 注册应用

创建应用后,需要在项目的settings.py文件中注册它,以便Django能够识别并包含它:
  1. # myproject/settings.py
  2. INSTALLED_APPS = [
  3.     'django.contrib.admin',
  4.     'django.contrib.auth',
  5.     'django.contrib.contenttypes',
  6.     'django.contrib.sessions',
  7.     'django.contrib.messages',
  8.     'django.contrib.staticfiles',
  9.     'blog',  # 添加新创建的应用
  10. ]
复制代码

4. 配置数据库

4.1 数据库设置

Django默认使用SQLite数据库,这对于开发和小型项目来说是一个很好的选择。在settings.py中,数据库配置如下:
  1. # myproject/settings.py
  2. DATABASES = {
  3.     'default': {
  4.         'ENGINE': 'django.db.backends.sqlite3',
  5.         'NAME': BASE_DIR / 'db.sqlite3',
  6.     }
  7. }
复制代码

如果您想使用其他数据库,如MySQL或PostgreSQL,可以修改配置:
  1. # MySQL配置示例
  2. DATABASES = {
  3.     'default': {
  4.         'ENGINE': 'django.db.backends.mysql',
  5.         'NAME': 'mydatabase',
  6.         'USER': 'mydatabaseuser',
  7.         'PASSWORD': 'mypassword',
  8.         'HOST': 'localhost',
  9.         'PORT': '3306',
  10.     }
  11. }
复制代码

4.2 数据库迁移

在定义模型后,需要创建并应用数据库迁移:
  1. # 创建迁移文件
  2. python manage.py makemigrations
  3. # 应用迁移
  4. python manage.py migrate
复制代码

5. 创建模型

模型是数据的单一、明确的信息来源,它包含您存储的数据的基本字段和行为。

5.1 定义模型

在blog/models.py中定义模型:
  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. class Category(models.Model):
  4.     name = models.CharField(max_length=100)
  5.     description = models.TextField(blank=True)
  6.    
  7.     def __str__(self):
  8.         return self.name
  9. class Tag(models.Model):
  10.     name = models.CharField(max_length=100)
  11.    
  12.     def __str__(self):
  13.         return self.name
  14. class Post(models.Model):
  15.     STATUS_CHOICES = (
  16.         ('draft', 'Draft'),
  17.         ('published', 'Published'),
  18.     )
  19.    
  20.     title = models.CharField(max_length=200)
  21.     slug = models.SlugField(max_length=250, unique_for_date='publish')
  22.     author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
  23.     content = models.TextField()
  24.     created_at = models.DateTimeField(auto_now_add=True)
  25.     updated_at = models.DateTimeField(auto_now=True)
  26.     publish = models.DateTimeField(default=timezone.now)
  27.     status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
  28.     categories = models.ManyToManyField(Category, related_name='posts')
  29.     tags = models.ManyToManyField(Tag, related_name='posts', blank=True)
  30.    
  31.     class Meta:
  32.         ordering = ['-publish']
  33.    
  34.     def __str__(self):
  35.         return self.title
  36. class Comment(models.Model):
  37.     post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
  38.     name = models.CharField(max_length=100)
  39.     email = models.EmailField()
  40.     content = models.TextField()
  41.     created_at = models.DateTimeField(auto_now_add=True)
  42.     updated_at = models.DateTimeField(auto_now=True)
  43.     active = models.BooleanField(default=True)
  44.    
  45.     class Meta:
  46.         ordering = ['-created_at']
  47.    
  48.     def __str__(self):
  49.         return f'Comment by {self.name} on {self.post}'
复制代码

5.2 激活模型

定义模型后,需要创建并应用迁移:
  1. python manage.py makemigrations blog
  2. python manage.py migrate
复制代码

5.3 注册模型到管理界面

要在Django管理界面中管理模型,需要在blog/admin.py中注册它们:
  1. from django.contrib import admin
  2. from .models import Category, Tag, Post, Comment
  3. @admin.register(Category)
  4. class CategoryAdmin(admin.ModelAdmin):
  5.     list_display = ['name', 'description']
  6.     search_fields = ['name']
  7. @admin.register(Tag)
  8. class TagAdmin(admin.ModelAdmin):
  9.     list_display = ['name']
  10.     search_fields = ['name']
  11. @admin.register(Post)
  12. class PostAdmin(admin.ModelAdmin):
  13.     list_display = ['title', 'author', 'publish', 'status']
  14.     list_filter = ['status', 'created_at', 'publish', 'author']
  15.     search_fields = ['title', 'content']
  16.     prepopulated_fields = {'slug': ('title',)}
  17.     raw_id_fields = ['author']
  18.     date_hierarchy = 'publish'
  19.     ordering = ['status', '-publish']
  20. @admin.register(Comment)
  21. class CommentAdmin(admin.ModelAdmin):
  22.     list_display = ['name', 'email', 'post', 'created_at', 'active']
  23.     list_filter = ['active', 'created_at']
  24.     search_fields = ['name', 'email', 'content']
复制代码

6. 视图和URL配置

视图处理Web请求并返回响应。URL配置将URL映射到视图。

6.1 创建视图

在blog/views.py中创建视图:
  1. from django.shortcuts import render, get_object_or_404
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3. from .models import Post, Category, Tag
  4. def post_list(request, category_slug=None, tag_slug=None):
  5.     posts = Post.objects.filter(status='published')
  6.    
  7.     # 按分类过滤
  8.     if category_slug:
  9.         category = get_object_or_404(Category, slug=category_slug)
  10.         posts = posts.filter(categories=category)
  11.    
  12.     # 按标签过滤
  13.     if tag_slug:
  14.         tag = get_object_or_404(Tag, slug=tag_slug)
  15.         posts = posts.filter(tags=tag)
  16.    
  17.     # 分页
  18.     paginator = Paginator(posts, 5)  # 每页5篇文章
  19.     page = request.GET.get('page')
  20.    
  21.     try:
  22.         posts = paginator.page(page)
  23.     except PageNotAnInteger:
  24.         # 如果page参数不是整数,返回第一页
  25.         posts = paginator.page(1)
  26.     except EmptyPage:
  27.         # 如果page超出范围,返回最后一页
  28.         posts = paginator.page(paginator.num_pages)
  29.    
  30.     context = {
  31.         'posts': posts,
  32.         'page': page,
  33.     }
  34.    
  35.     return render(request, 'blog/post/list.html', context)
  36. def post_detail(request, year, month, day, post):
  37.     post = get_object_or_404(
  38.         Post,
  39.         slug=post,
  40.         status='published',
  41.         publish__year=year,
  42.         publish__month=month,
  43.         publish__day=day
  44.     )
  45.    
  46.     # 获取文章的评论
  47.     comments = post.comments.filter(active=True)
  48.    
  49.     context = {
  50.         'post': post,
  51.         'comments': comments,
  52.     }
  53.    
  54.     return render(request, 'blog/post/detail.html', context)
复制代码

6.2 创建URL配置

首先,在blog应用目录下创建urls.py文件:
  1. from django.urls import path
  2. from . import views
  3. app_name = 'blog'
  4. urlpatterns = [
  5.     # 文章列表
  6.     path('', views.post_list, name='post_list'),
  7.     path('category/<slug:category_slug>/', views.post_list, name='post_list_by_category'),
  8.     path('tag/<slug:tag_slug>/', views.post_list, name='post_list_by_tag'),
  9.    
  10.     # 文章详情
  11.     path('<int:year>/<int:month>/<int:day>/<slug:post>/',
  12.          views.post_detail,
  13.          name='post_detail'),
  14. ]
复制代码

然后,在项目的主urls.py文件中包含应用的URL配置:
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. urlpatterns = [
  4.     path('admin/', admin.site.urls),
  5.     path('', include('blog.urls')),
  6. ]
复制代码

7. 模板系统

Django的模板系统允许您将业务逻辑与表示层分离。

7.1 创建模板目录结构

在blog应用目录下创建以下目录结构:
  1. blog/
  2.     templates/
  3.         blog/
  4.             base.html
  5.             post/
  6.                 list.html
  7.                 detail.html
复制代码

7.2 创建基础模板

blog/templates/blog/base.html:
  1. {% load static %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>{% block title %}My Blog{% endblock %}</title>
  8.     <link rel="stylesheet" href="{% static 'css/blog.css' %}">
  9. </head>
  10. <body>
  11.     <header>
  12.         <h1><a href="{% url 'blog:post_list' %}">My Blog</a></h1>
  13.         <nav>
  14.             <ul>
  15.                 <li><a href="{% url 'blog:post_list' %}">Home</a></li>
  16.                 <!-- 可以添加更多导航链接 -->
  17.             </ul>
  18.         </nav>
  19.     </header>
  20.    
  21.     <main>
  22.         {% block content %}
  23.         {% endblock %}
  24.     </main>
  25.    
  26.     <footer>
  27.         <p>&copy; {% now "Y" %} My Blog. All rights reserved.</p>
  28.     </footer>
  29.    
  30.     <script src="{% static 'js/blog.js' %}"></script>
  31. </body>
  32. </html>
复制代码

7.3 创建文章列表模板

blog/templates/blog/post/list.html:
  1. {% extends "blog/base.html" %}
  2. {% block title %}My Blog - Latest Posts{% endblock %}
  3. {% block content %}
  4.     <h1>Latest Posts</h1>
  5.    
  6.     {% for post in posts %}
  7.         <article class="post">
  8.             <h2><a href="{{ post.get_absolute_url }}">{{ post.title }}</a></h2>
  9.             <p class="post-meta">
  10.                 Published on {{ post.publish }} by {{ post.author }}
  11.             </p>
  12.             <p class="post-content">
  13.                 {{ post.content|truncatewords:30 }}
  14.             </p>
  15.             <div class="post-categories">
  16.                 Categories:
  17.                 {% for category in post.categories.all %}
  18.                     <a href="{% url 'blog:post_list_by_category' category.slug %}">{{ category.name }}</a>
  19.                     {% if not forloop.last %}, {% endif %}
  20.                 {% endfor %}
  21.             </div>
  22.             <div class="post-tags">
  23.                 Tags:
  24.                 {% for tag in post.tags.all %}
  25.                     <a href="{% url 'blog:post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
  26.                     {% if not forloop.last %}, {% endif %}
  27.                 {% endfor %}
  28.             </div>
  29.         </article>
  30.     {% empty %}
  31.         <p>No posts available.</p>
  32.     {% endfor %}
  33.    
  34.     <!-- 分页 -->
  35.     {% if posts.has_other_pages %}
  36.         <div class="pagination">
  37.             {% if posts.has_previous %}
  38.                 <a href="?page={{ posts.previous_page_number }}">&laquo; Previous</a>
  39.             {% endif %}
  40.             
  41.             <span class="page-current">
  42.                 Page {{ posts.number }} of {{ posts.paginator.num_pages }}
  43.             </span>
  44.             
  45.             {% if posts.has_next %}
  46.                 <a href="?page={{ posts.next_page_number }}">Next &raquo;</a>
  47.             {% endif %}
  48.         </div>
  49.     {% endif %}
  50. {% endblock %}
复制代码

7.4 创建文章详情模板

blog/templates/blog/post/detail.html:
  1. {% extends "blog/base.html" %}
  2. {% block title %}{{ post.title }}{% endblock %}
  3. {% block content %}
  4.     <article class="post-detail">
  5.         <h1>{{ post.title }}</h1>
  6.         <p class="post-meta">
  7.             Published on {{ post.publish }} by {{ post.author }}
  8.         </p>
  9.         
  10.         <div class="post-content">
  11.             {{ post.content|linebreaks }}
  12.         </div>
  13.         
  14.         <div class="post-categories">
  15.             Categories:
  16.             {% for category in post.categories.all %}
  17.                 <a href="{% url 'blog:post_list_by_category' category.slug %}">{{ category.name }}</a>
  18.                 {% if not forloop.last %}, {% endif %}
  19.             {% endfor %}
  20.         </div>
  21.         
  22.         <div class="post-tags">
  23.             Tags:
  24.             {% for tag in post.tags.all %}
  25.                 <a href="{% url 'blog:post_list_by_tag' tag.slug %}">{{ tag.name }}</a>
  26.                 {% if not forloop.last %}, {% endif %}
  27.             {% endfor %}
  28.         </div>
  29.     </article>
  30.    
  31.     <section class="comments">
  32.         <h2>Comments</h2>
  33.         
  34.         {% for comment in comments %}
  35.             <div class="comment">
  36.                 <h3>{{ comment.name }}</h3>
  37.                 <p class="comment-meta">
  38.                     On {{ comment.created_at }}
  39.                 </p>
  40.                 <p>{{ comment.content|linebreaks }}</p>
  41.             </div>
  42.         {% empty %}
  43.             <p>There are no comments yet.</p>
  44.         {% endfor %}
  45.     </section>
  46. {% endblock %}
复制代码

8. 静态文件管理

静态文件包括CSS、JavaScript、图像等。

8.1 配置静态文件

在settings.py中配置静态文件:
  1. # myproject/settings.py
  2. STATIC_URL = '/static/'
  3. STATIC_ROOT = BASE_DIR / 'staticfiles'
  4. STATICFILES_DIRS = [
  5.     BASE_DIR / 'static',
  6. ]
复制代码

8.2 创建静态文件目录结构

在项目根目录下创建静态文件目录结构:
  1. static/
  2.     css/
  3.         blog.css
  4.     js/
  5.         blog.js
  6.     images/
复制代码

8.3 示例静态文件

static/css/blog.css:
  1. /* 基本样式 */
  2. body {
  3.     font-family: Arial, sans-serif;
  4.     line-height: 1.6;
  5.     margin: 0;
  6.     padding: 0;
  7.     color: #333;
  8. }
  9. /* 布局 */
  10. header {
  11.     background-color: #333;
  12.     color: #fff;
  13.     padding: 1rem;
  14.     text-align: center;
  15. }
  16. header h1 a {
  17.     color: #fff;
  18.     text-decoration: none;
  19. }
  20. nav ul {
  21.     padding: 0;
  22.     list-style: none;
  23. }
  24. nav ul li {
  25.     display: inline;
  26.     margin: 0 10px;
  27. }
  28. nav ul li a {
  29.     color: #fff;
  30.     text-decoration: none;
  31. }
  32. main {
  33.     max-width: 800px;
  34.     margin: 2rem auto;
  35.     padding: 0 1rem;
  36. }
  37. footer {
  38.     background-color: #333;
  39.     color: #fff;
  40.     text-align: center;
  41.     padding: 1rem;
  42.     margin-top: 2rem;
  43. }
  44. /* 文章样式 */
  45. .post {
  46.     margin-bottom: 2rem;
  47.     padding-bottom: 1rem;
  48.     border-bottom: 1px solid #ddd;
  49. }
  50. .post h2 a {
  51.     color: #333;
  52.     text-decoration: none;
  53. }
  54. .post h2 a:hover {
  55.     color: #0066cc;
  56. }
  57. .post-meta {
  58.     color: #666;
  59.     font-size: 0.9rem;
  60.     margin-bottom: 1rem;
  61. }
  62. .post-content {
  63.     margin-bottom: 1rem;
  64. }
  65. .post-categories, .post-tags {
  66.     margin-top: 0.5rem;
  67.     font-size: 0.9rem;
  68. }
  69. .post-categories a, .post-tags a {
  70.     color: #0066cc;
  71.     text-decoration: none;
  72. }
  73. .post-categories a:hover, .post-tags a:hover {
  74.     text-decoration: underline;
  75. }
  76. /* 分页样式 */
  77. .pagination {
  78.     margin: 2rem 0;
  79.     text-align: center;
  80. }
  81. .pagination a {
  82.     color: #0066cc;
  83.     text-decoration: none;
  84.     padding: 0.5rem 1rem;
  85.     border: 1px solid #ddd;
  86.     margin: 0 0.25rem;
  87. }
  88. .pagination a:hover {
  89.     background-color: #f5f5f5;
  90. }
  91. .page-current {
  92.     padding: 0.5rem 1rem;
  93.     margin: 0 0.25rem;
  94. }
  95. /* 评论样式 */
  96. .comments {
  97.     margin-top: 3rem;
  98. }
  99. .comment {
  100.     margin-bottom: 1.5rem;
  101.     padding-bottom: 1rem;
  102.     border-bottom: 1px solid #eee;
  103. }
  104. .comment h3 {
  105.     margin-bottom: 0.25rem;
  106. }
  107. .comment-meta {
  108.     color: #666;
  109.     font-size: 0.9rem;
  110.     margin-bottom: 0.5rem;
  111. }
复制代码

static/js/blog.js:
  1. // 简单的JavaScript功能
  2. document.addEventListener('DOMContentLoaded', function() {
  3.     // 可以在这里添加交互功能
  4.     console.log('Blog loaded successfully!');
  5. });
复制代码

9. 用户认证系统

Django提供了强大的用户认证系统,包括用户注册、登录、注销和权限管理。

9.1 包含认证URL

在项目的主urls.py中添加Django认证系统的URL:
  1. from django.contrib import admin
  2. from django.urls import path, include
  3. urlpatterns = [
  4.     path('admin/', admin.site.urls),
  5.     path('', include('blog.urls')),
  6.     path('accounts/', include('django.contrib.auth.urls')),  # 添加认证URL
  7. ]
复制代码

9.2 创建认证模板

在blog/templates/registration/目录下创建以下模板:

login.html:
  1. {% extends "blog/base.html" %}
  2. {% block title %}Log In{% endblock %}
  3. {% block content %}
  4.     <h1>Log In</h1>
  5.    
  6.     <form method="post">
  7.         {% csrf_token %}
  8.         {{ form.as_p }}
  9.         <button type="submit">Log In</button>
  10.     </form>
  11.    
  12.     <p><a href="{% url 'password_reset' %}">Forgot your password?</a></p>
  13. {% endblock %}
复制代码

logged_out.html:
  1. {% extends "blog/base.html" %}
  2. {% block title %}Logged Out{% endblock %}
  3. {% block content %}
  4.     <h1>You have been logged out</h1>
  5.     <p><a href="{% url 'login' %}">Log in again</a></p>
  6. {% endblock %}
复制代码

password_reset_form.html:
  1. {% extends "blog/base.html" %}
  2. {% block title %}Reset Password{% endblock %}
  3. {% block content %}
  4.     <h1>Reset Password</h1>
  5.    
  6.     <form method="post">
  7.         {% csrf_token %}
  8.         {{ form.as_p }}
  9.         <button type="submit">Reset Password</button>
  10.     </form>
  11. {% endblock %}
复制代码

9.3 更新基础模板

在base.html中添加登录/注销链接:
  1. <header>
  2.     <h1><a href="{% url 'blog:post_list' %}">My Blog</a></h1>
  3.     <nav>
  4.         <ul>
  5.             <li><a href="{% url 'blog:post_list' %}">Home</a></li>
  6.             {% if user.is_authenticated %}
  7.                 <li><a href="{% url 'admin:index' %}">Admin</a></li>
  8.                 <li><a href="{% url 'logout' %}">Logout</a></li>
  9.             {% else %}
  10.                 <li><a href="{% url 'login' %}">Login</a></li>
  11.             {% endif %}
  12.         </ul>
  13.     </nav>
  14. </header>
复制代码

9.4 配置重定向URL

在settings.py中添加登录和注销后的重定向URL:
  1. # myproject/settings.py
  2. LOGIN_REDIRECT_URL = '/'
  3. LOGOUT_REDIRECT_URL = '/'
复制代码

10. 创建超级用户

要访问Django管理界面,需要创建一个超级用户:
  1. python manage.py createsuperuser
复制代码

按照提示输入用户名、电子邮件和密码。

11. 测试项目

11.1 创建测试数据

在Django shell中创建一些测试数据:
  1. python manage.py shell
复制代码
  1. from django.contrib.auth.models import User
  2. from blog.models import Category, Tag, Post
  3. from django.utils import timezone
  4. import datetime
  5. # 创建用户
  6. user = User.objects.create_user('testuser', 'test@example.com', 'password')
  7. # 创建分类
  8. category1 = Category.objects.create(name='Django', description='All about Django')
  9. category2 = Category.objects.create(name='Python', description='Python programming')
  10. # 创建标签
  11. tag1 = Tag.objects.create(name='Web Development')
  12. tag2 = Tag.objects.create(name='Tutorial')
  13. # 创建文章
  14. post1 = Post.objects.create(
  15.     title='Getting Started with Django',
  16.     slug='getting-started-with-django',
  17.     author=user,
  18.     content='This is the content of the first post...',
  19.     publish=timezone.now() - datetime.timedelta(days=2),
  20.     status='published'
  21. )
  22. post1.categories.add(category1)
  23. post1.tags.add(tag1, tag2)
  24. post2 = Post.objects.create(
  25.     title='Python Best Practices',
  26.     slug='python-best-practices',
  27.     author=user,
  28.     content='This is the content of the second post...',
  29.     publish=timezone.now() - datetime.timedelta(days=1),
  30.     status='published'
  31. )
  32. post2.categories.add(category2)
  33. post2.tags.add(tag2)
  34. exit()
复制代码

11.2 运行开发服务器
  1. python manage.py runserver
复制代码

访问以下URL测试您的应用:

• http://127.0.0.1:8000/- 主页,显示文章列表
• http://127.0.0.1:8000/admin/- 管理界面
• http://127.0.0.1:8000/accounts/login/- 登录页面

12. 部署准备

12.1 收集静态文件

在生产环境中,需要将所有静态文件收集到一个目录中:
  1. python manage.py collectstatic
复制代码

12.2 设置环境变量

在生产环境中,不要将敏感信息(如数据库密码、密钥等)硬编码在settings.py中。可以使用环境变量或.env文件。

安装python-decouple:
  1. pip install python-decouple
复制代码

创建.env文件:
  1. DEBUG=False
  2. SECRET_KEY=your-secret-key-here
  3. DATABASE_URL=your-database-url-here
复制代码

在settings.py中使用环境变量:
  1. from decouple import config
  2. DEBUG = config('DEBUG', default=False, cast=bool)
  3. SECRET_KEY = config('SECRET_KEY')
  4. # 数据库配置
  5. DATABASES = {
  6.     'default': config('DATABASE_URL', cast='dj_database_url.parse')
  7. }
复制代码

12.3 生产环境设置

创建生产环境的设置文件myproject/settings_production.py:
  1. from .settings import *
  2. # 安全设置
  3. DEBUG = False
  4. ALLOWED_HOSTS = ['yourdomain.com', 'www.yourdomain.com']
  5. # 静态文件
  6. STATIC_ROOT = BASE_DIR / 'staticfiles'
  7. # 安全中间件
  8. SECURE_SSL_REDIRECT = True
  9. SESSION_COOKIE_SECURE = True
  10. CSRF_COOKIE_SECURE = True
  11. SECURE_BROWSER_XSS_FILTER = True
  12. SECURE_CONTENT_TYPE_NOSNIFF = True
  13. X_FRAME_OPTIONS = 'DENY'
复制代码

13. 常见问题和解决方案

13.1 模板未找到

问题:TemplateDoesNotExist错误。

解决方案:

1. 确保模板目录结构正确。
2. 检查settings.py中的TEMPLATES设置。
3. 确保应用已添加到INSTALLED_APPS中。

13.2 静态文件未加载

问题:CSS、JavaScript或图像文件未加载。

解决方案:

1. 确保在模板中正确使用了{% static %}标签。
2. 检查settings.py中的静态文件设置。
3. 运行python manage.py collectstatic收集静态文件。
4. 确保Web服务器配置正确处理静态文件。

13.3 数据库迁移问题

问题:迁移失败或出现错误。

解决方案:

1. 检查模型定义是否有语法错误。
2. 删除迁移文件并重新创建。
3. 使用python manage.py showmigrations检查迁移状态。
4. 使用python manage.py migrate --fake跳过有问题的迁移。

13.4 权限问题

问题:用户无法访问特定页面或功能。

解决方案:

1. 检查视图中的权限装饰器。
2. 确保用户具有所需的权限。
3. 检查模板中的条件显示逻辑。

14. 总结和进阶学习资源

通过本指南,您已经学习了如何从零开始创建一个完整的Django项目,包括环境设置、项目创建、应用开发、模型定义、视图和URL配置、模板系统、静态文件管理、用户认证系统以及部署准备。

14.1 进阶学习资源

1. 官方文档:https://docs.djangoproject.com/- Django官方文档是最全面、最权威的学习资源。
2. Django for Professionals:https://djangoforprofessionals.com/- 适合有一定基础的开发者,学习如何构建生产级Django应用。
3. Django for APIs:https://djangoforapis.com/- 学习如何使用Django构建RESTful API。
4. Test-Driven Development with Python:https://www.obeythetestinggoat.com/- 学习使用测试驱动开发方法构建Django应用。
5. Django REST Framework:https://www.django-rest-framework.org/- 学习使用Django REST框架构建Web API。
6. Django Girls Tutorial:https://tutorial.djangogirls.org/- 适合初学者的友好教程。

官方文档:https://docs.djangoproject.com/- Django官方文档是最全面、最权威的学习资源。

Django for Professionals:https://djangoforprofessionals.com/- 适合有一定基础的开发者,学习如何构建生产级Django应用。

Django for APIs:https://djangoforapis.com/- 学习如何使用Django构建RESTful API。

Test-Driven Development with Python:https://www.obeythetestinggoat.com/- 学习使用测试驱动开发方法构建Django应用。

Django REST Framework:https://www.django-rest-framework.org/- 学习使用Django REST框架构建Web API。

Django Girls Tutorial:https://tutorial.djangogirls.org/- 适合初学者的友好教程。

14.2 实践项目建议

1. 博客系统:扩展本指南中的博客应用,添加更多功能,如评论系统、标签云、搜索功能等。
2. 电子商务网站:构建一个完整的电子商务网站,包括产品目录、购物车、订单处理和支付集成。
3. 社交媒体应用:创建一个简单的社交媒体应用,包括用户个人资料、帖子、关注系统和通知。
4. 任务管理工具:开发一个类似Trello的任务管理工具,包括项目、任务列表、卡片和拖放功能。
5. 内容管理系统:构建一个自定义的内容管理系统,允许用户创建和管理不同类型的内容。

博客系统:扩展本指南中的博客应用,添加更多功能,如评论系统、标签云、搜索功能等。

电子商务网站:构建一个完整的电子商务网站,包括产品目录、购物车、订单处理和支付集成。

社交媒体应用:创建一个简单的社交媒体应用,包括用户个人资料、帖子、关注系统和通知。

任务管理工具:开发一个类似Trello的任务管理工具,包括项目、任务列表、卡片和拖放功能。

内容管理系统:构建一个自定义的内容管理系统,允许用户创建和管理不同类型的内容。

通过不断实践和学习,您将能够掌握Django框架,并利用它构建高效、稳定的Web应用程序。祝您在Django开发之旅中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.

>