马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一:项目快速入门
1. 环境准备与项目创建
- # 创建虚拟环境
- python -m venv myenv
- source myenv/bin/activate # Linux/Mac
- myenv\Scripts\activate.bat # Windows
- # 安装依赖
- pip install django==4.2.5 django-ckeditor
- # 初始化项目
- django-admin startproject book_manager
- cd book_manager
复制代码 2. 项目布局解析
- book_manager/
- ├── book_manager/
- │ ├── __init__.py
- │ ├── settings.py # 全局配置
- │ ├── urls.py # 主路由
- │ └── wsgi.py # 生产入口
- ├── books/ # 应用目录
- │ ├── migrations/ # 数据库迁移
- │ ├── templates/ # 模板文件
- │ ├── __init__.py
- │ ├── admin.py # 管理后台
- │ ├── apps.py # 应用配置
- │ ├── models.py # 数据模型
- │ ├── tests.py # 单元测试
- │ └── views.py # 视图逻辑
- └── manage.py # 管理脚本
复制代码 二、MTV核心组件实践
1. Model层 - 数据引擎
- # books/models.py
- from django.db import models
- class Author(models.Model):
- name = models.CharField(max_length=100)
- bio = models.TextField()
-
- def published_books(self):
- return self.books.filter(is_published=True)
- class Book(models.Model):
- title = models.CharField(max_length=200)
- author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
- content = models.TextField()
- is_published = models.BooleanField(default=False)
- publish_date = models.DateTimeField(auto_now_add=True)
- class Meta:
- ordering = ['-publish_date']
- indexes = [models.Index(fields=['is_published'])]
- def __str__(self):
- return f"{self.title} - {self.author.name}"
复制代码 迁移利用:
- python manage.py makemigrations
- python manage.py migrate
复制代码 2. View层 - 业务指挥官
- # books/views.py
- from django.views.generic import ListView, DetailView
- from .models import Book
- class BookListView(ListView):
- model = Book
- template_name = 'books/list.html'
- context_object_name = 'book_list'
- paginate_by = 10
- def get_queryset(self):
- return super().get_queryset().filter(is_published=True).select_related('author')
- class BookDetailView(DetailView):
- model = Book
- template_name = 'books/detail.html'
-
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- context['related_books'] = self.object.author.books.exclude(pk=self.object.pk)[:3]
- return context
复制代码 3. Template层 - 展示管家
- <!-- books/templates/books/list.html -->
- {% extends "base.html" %}
- {% block content %}
- <section class="book-listing">
- <h2>最新上架书籍</h2>
- <div class="grid">
- {% for book in book_list %}
- <article class="card">
- <header>
- <h3>{{ book.title }}</h3>
- <p class="author">作者:{{ book.author.name }}</p>
- </header>
- <div class="content">
- {{ book.content|truncatechars:150 }}
- </div>
- <footer>
- <a href="{% url 'book_detail' book.pk %}" class="button">查看详情</a>
- </footer>
- </article>
- {% empty %}
- <p class="empty">暂无书籍信息</p>
- {% endfor %}
- </div>
- {% include "includes/pagination.html" %}
- </section>
- {% endblock %}
复制代码 三、MTV全流程解析
1. 请求生命周期流程图
2. 三大组件协作关系
组件职责对应文件核心扩展点Model界说数据布局与业务规则models.py自界说Manager/QuerySetView处理业务逻辑与流程控制views.pyClass-based Views/MixinsTemplate数据可视化与用户交互templates/*.html自界说Template Tags 四、高级开发本领
1. 管理后台
- # books/admin.py
- @admin.register(Book)
- class BookAdmin(admin.ModelAdmin):
- list_display = ('title', 'author', 'publish_status')
- list_editable = ('is_published',)
- raw_id_fields = ('author',)
-
- @admin.display(description="发布状态")
- def publish_status(self, obj):
- return "已发布" if obj.is_published else "待审核"
- @admin.register(Author)
- class AuthorAdmin(admin.ModelAdmin):
- search_fields = ('name',)
- list_display = ('name', 'book_count')
-
- @admin.display(description="著作数量")
- def book_count(self, obj):
- return obj.books.count()
复制代码 2. 性能优化计谋
- 查询优化:
- # 使用select_related减少查询次数
- Book.objects.select_related('author').filter(is_published=True)
- # 使用prefetch_related优化多对多关系
- Author.objects.prefetch_related('books').all()
复制代码 - 缓存优化:
- from django.views.decorators.cache import cache_page
- @cache_page(60 * 15)
- def book_list(request):
- # ...
复制代码 3. 架构扩展方案
- # book_manager/middleware.py
- class PerformanceMiddleware:
- def __init__(self, get_response):
- self.get_response = get_response
-
- def __call__(self, request):
- start_time = time.time()
- response = self.get_response(request)
- duration = time.time() - start_time
- print(f"请求处理耗时: {duration:.2f}s")
- return response
复制代码 五、最佳实践总结
- MTV开发黄金法则
- 模型驱动开发:先设计数据模型再编写业务逻辑
- 视图保持精简:复杂逻辑移交给模型或工具模块
- 模板职责单一:制止在模板中编写业务逻辑
- 组件复用优先:通过Mixin、Include等方式减少重复
- 常见题目解决方案
题目征象排查方向解决方案页面加载痴钝数据库查询优化使用select_related/prefetch_related管理后台利用卡顿列表页性能添加数据库索引/分页显示模板渲染异常上下文变量检查使用{% debug %}标签表单提交失败CSRF验证与表单校验检查表单界说与中心件设置
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |