Django CMS 教程
1. Django 简介和特性
Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、实用的设计。它遵循 MVT(Model-View-Template)架构,提供了许多内置功能,如用户认证、内容管理、表单处理、文件上传等。
主要特性
- ORM(对象关系映射):简化数据库操作。
- Admin 后台:自动生成管理界面。
- 表单处理:简化表单创建和验证。
- 安全性:内置 CSRF 保护、XSS 防御等。
2. 安装和环境设置
安装 Django
pip install django
创建项目
django-admin startproject myproject
cd myproject
运行开发服务器
python manage.py runserver
3. 项目结构和管理命令
项目结构
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
常用管理命令
- 创建应用:
python manage.py startapp myapp - 数据库迁移:
python manage.py makemigrations和python manage.py migrate - 创建超级用户:
python manage.py createsuperuser
4. MVT (Model-View-Template) 架构
Model
- 定义数据结构和数据库操作。
- 示例:
from django.db import models class Article(models.Model): title = models.CharField(max_length=200) content = models.TextField() pub_date = models.DateTimeField('date published')
View
- 处理请求并返回响应。
- 示例:
from django.http import HttpResponse def home_view(request): return HttpResponse("Hello, Django!")
Template
- 渲染 HTML 页面。
- 示例:
<html> <body> <h1>{{ title }}</h1> <p>{{ content }}</p> </body> </html>
5. 第一个 Django 应用
创建应用
python manage.py startapp myapp
定义模型
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
创建视图
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all()
return render(request, 'myapp/article_list.html', {'articles': articles})
配置 URL
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list, name='article_list'),
]
6. 模型定义和字段类型
常用字段类型
CharField:字符串字段。TextField:文本字段。DateTimeField:日期时间字段。IntegerField:整数字段。
示例
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
views = models.IntegerField(default=0)
7. 数据库迁移
创建迁移文件
python manage.py makemigrations
应用迁移
python manage.py migrate
8. 查询集和管理器
查询集
- 用于从数据库中获取数据。
- 示例:
articles = Article.objects.filter(pub_date__year=2023)
管理器
- 自定义查询集。
- 示例:
class PublishedManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(pub_date__lte=timezone.now()) class Article(models.Model): objects = models.Manager() published = PublishedManager()
9. 模型关系 (一对多、多对多)
一对多关系
class Author(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
author = models.ForeignKey(Author, on_delete=models.CASCADE)
多对多关系
class Tag(models.Model):
name = models.CharField(max_length=100)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
tags = models.ManyToManyField(Tag)
10. 自定义模型方法
示例
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField('date published')
def is_published(self):
return self.pub_date <= timezone.now()
11. 函数视图和类视图
函数视图
def article_detail(request, article_id):
article = get_object_or_404(Article, id=article_id)
return render(request, 'myapp/article_detail.html', {'article': article})
类视图
from django.views import View
class ArticleDetailView(View):
def get(self, request, article_id):
article = get_object_or_404(Article, id=article_id)
return render(request, 'myapp/article_detail.html', {'article': article})
12. URL 模式和命名
示例
from django.urls import path
from . import views
urlpatterns = [
path('articles/', views.article_list, name='article_list'),
path('articles/<int:article_id>/', views.article_detail, name='article_detail'),
]
13. 视图参数和请求处理
示例
def article_detail(request, article_id):
article = get_object_or_404(Article, id=article_id)
return render(request, 'myapp/article_detail.html', {'article': article})
14. 通用视图
示例
from django.views.generic import ListView, DetailView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = 'myapp/article_list.html'
context_object_name = 'articles'
class ArticleDetailView(DetailView):
model = Article
template_name = 'myapp/article_detail.html'
context_object_name = 'article'
15. 中间件
示例
from django.utils.deprecation import MiddlewareMixin
class CustomMiddleware(MiddlewareMixin):
def process_request(self, request):
print("Request received")
16. 模板语法和标签
示例
<html>
<body>
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p>Published on: {{ article.pub_date }}</p>
</body>
</html>
17. 模板继承
基础模板
<!-- base.html -->
<html>
<body>
{% block content %}{% endblock %}
</body>
</html>
子模板
<!-- article_detail.html -->
{% extends 'base.html' %}
{% block content %}
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<p>Published on: {{ article.pub_date }}</p>
{% endblock %}
18. 上下文处理器
示例
def custom_context(request):
return {'custom_var': 'Custom Value'}
19. 自定义模板标签和过滤器
示例
from django import template
register = template.Library()
@register.filter
def upper_case(value):
return value.upper()
20. 静态文件处理
配置
STATIC_URL = '/static/'
STATICFILES_DIRS = [
BASE_DIR / "static",
]
使用
<link rel="stylesheet" href="{% static 'css/style.css' %}">
21. Django Form 类
示例
from django import forms
class ArticleForm(forms.Form):
title = forms.CharField(max_length=200)
content = forms.CharField(widget=forms.Textarea)
22. 表单验证
示例
class ArticleForm(forms.Form):
title = forms.CharField(max_length=200)
content = forms.CharField(widget=forms.Textarea)
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Title must be at least 5 characters long.")
return title
23. ModelForm
示例
from django.forms import ModelForm
from .models import Article
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
24. 表单集 (Formsets)
示例
from django.forms import formset_factory
from .forms import ArticleForm
ArticleFormSet = formset_factory(ArticleForm, extra=2)
25. 文件上传处理
示例
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
26. 用户认证系统
示例
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
return render(request, 'login.html', {'error': 'Invalid credentials'})
return render(request, 'login.html')
27. 自定义用户模型
示例
from django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
bio = models.TextField(max_length=500, blank=True)
28. 权限和组
示例
from django.contrib.auth.models import Group, Permission
group = Group.objects.create(name='Editors')
permission = Permission.objects.get(codename='add_article')
group.permissions.add(permission)
29. 登录、注销和注册视图
示例
from django.contrib.auth import login, logout
from django.contrib.auth.forms import UserCreationForm
def register_view(request):
if request.method == 'POST':
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect('login')
else:
form = UserCreationForm()
return render(request, 'register.html', {'form': form})
def logout_view(request):
logout(request)
return redirect('home')
30. 基于类的权限控制
示例
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
class ProtectedView(LoginRequiredMixin, View):
def get(self, request):
return HttpResponse("Protected content")
31. Admin 站点定制
示例
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'pub_date', 'author')
list_filter = ('pub_date', 'author')
search_fields = ('title', 'content')
32. 模型注册和配置
示例
from django.contrib import admin
from .models import Article
admin.site.register(Article)
33. 自定义 Admin 操作
示例
from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
actions = ['make_published']
def make_published(self, request, queryset):
queryset.update(status='p')
make_published.short_description = "Mark selected articles as published"
34. Admin 主题和样式
示例
from django.contrib import admin
admin.site.site_header = "My Custom Admin"
admin.site.site_title = "My Custom Admin Portal"
admin.site.index_title = "Welcome to My Custom Admin Portal"
35. 权限和分组管理
示例
from django.contrib.auth.models import Group, Permission
group = Group.objects.create(name='Editors')
permission = Permission.objects.get(codename='add_article')
group.permissions.add(permission)
36. 会话框架
示例
def set_session(request):
request.session['favorite_color'] = 'blue'
return HttpResponse("Session set")
def get_session(request):
favorite_color = request.session.get('favorite_color', 'unknown')
return HttpResponse(f"Favorite color: {favorite_color}")
37. Cookie 处理
示例
def set_cookie(request):
response = HttpResponse("Cookie set")
response.set_cookie('favorite_color', 'blue')
return response
def get_cookie(request):
favorite_color = request.COOKIES.get('favorite_color', 'unknown')
return HttpResponse(f"Favorite color: {favorite_color}")
38. 用户状态管理
示例
def user_status(request):
if request.user.is_authenticated:
return HttpResponse(f"Welcome, {request.user.username}")
else:
return HttpResponse("Please log in")
39. 购物车实现
示例
from django.shortcuts import render, redirect
from .models import Product
def add_to_cart(request, product_id):
product = Product.objects.get(id=product_id)
cart = request.session.get('cart', {})
cart[product_id] = cart.get(product_id, 0) + 1
request.session['cart'] = cart
return redirect('cart')
def view_cart(request):
cart = request.session.get('cart', {})
products = Product.objects.filter(id__in=cart.keys())
return render(request, 'cart.html', {'cart': cart, 'products': products})
40. 缓存后端配置
示例
CACHES = {
'default': {
'BACKEND': 'django