User 实体:包含 username, email, bio, avatarPost 实体:包含 title, content, author(外键指向 User)python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows
隔离项目依赖,避免包冲突。
pip install django pip install djangorestframework # 如果做 API
django-admin startproject myproject cd myproject
生成标准项目结构:manage.py、settings.py、urls.py 等。
python manage.py startapp users python manage.py startapp posts
每个 App 负责一个功能模块(如 users、posts)。
在 settings.py 中注册:
INSTALLED_APPS = [
...
'users',
'posts',
]
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
email = models.EmailField(unique=True)
bio = models.TextField(blank=True)
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
迁移数据库:
python manage.py makemigrations python manage.py migrate
settings.py 中设置:
AUTH_USER_MODEL = 'users.User'
LOGIN_URL = '/accounts/login/'
@login_required
def profile(request):
return render(request, 'profile.html', {'user': request.user})
class PostListView(ListView):
model = Post
template_name = 'posts/list.html'
context_object_name = 'posts'
paginate_by = 10
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
项目级路由(myproject/urls.py)
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('posts/', include('posts.urls')),
path('api/', include('api.urls')),
]
应用级路由(users/urls.py)
urlpatterns = [
path('profile/', views.profile, name='profile'),
]
模板中反向解析:{% url 'profile' %}
目录结构建议:
users/
└── templates/
└── users/
└── profile.html
模板示例:
<h1>欢迎,{{ user.username }}!</h1>
<p>邮箱:{{ user.email }}</p>
静态文件引用:
{% load static %}
<link rel="stylesheet" href="{% static 'css/style.css' %}">
DEBUG = True(开发),生产必须设为 FalseALLOWED_HOSTS = ['yourdomain.com']python manage.py collectstaticclass UserModelTest(TestCase):
def test_create_user(self):
User = get_user_model()
user = User.objects.create_user(
username='testuser',
email='test@example.com',
password='secret'
)
self.assertEqual(user.email, 'test@example.com')
运行测试:python manage.py test
python manage.py runserver
仅用于开发!不要用于生产。
gunicorn、psycopg2-binary 等python manage.py collectstatic --noinputpython manage.py createsuperusermakemigrations → migrate| 项目 | 建议 |
|---|---|
| 模型 | 尽量使用 null=False, blank=False 明确约束 |
| 视图 | 优先使用 CBV 或 DRF ViewSet |
| 安全 | 永远不要在代码中硬编码 SECRET_KEY |
| 性能 | 使用 select_related / prefetch_related 避免 N+1 查询 |
| 日志 | 配置 LOGGING 记录错误 |
| 环境 | 使用 .env 文件管理配置(配合 django-environ) |