前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 实现上传文件功能
- 播放视频
- 下载文件
二、详情解读
2.1.上传文件功能
2.1.1.功能
- 为课程上传视频文件和附件
– 视频文件和附件文件保存到服务器 - 浏览课程
– 在线观看视频文件
– 下载附件
2.2.开发过程
2.2.1.上传
models.py
:Course
增加两个字段:
–video = models.FileField(blank=True, upload_to='videos/')
–attach = models.FileField(blank=True, upload_to=user_directory_path)
说明:这里
blank=True
都默认为空,是因为数据库已经有数据了,如果新增的字段不默认为空,则需要为它们添加数据,为图省事,这里都默认为空。
- 迁移数据
python3 manage.py makemigrations course
python3 manage.py migrate
settings.py
,配置文件存储位置
–MEDIA_URL='/media/'
–MEDIA_ROOT=os.path.join(BASE_DIR, 'media')
forms.py
增加字段
–fields = ('title', 'overview', 'video', 'attach')
views.py
,修改类视图CourseCreateView
–fields = ['title', 'overview', 'video', 'attach' ]
–form = CourseCreatedForm(request.POST, request.FILES)
course_create.html
,修改模板
–<form action="." method="post" enctype="multipart/form-data">
实操一: 上传课程文件
step1
:新增字段。编辑文件myproject/course/models.py
from django.db import models
from django.contrib.auth.models import User
# new
def user_directory_path(instance, filename):
return 'courses/user_{0}/{1}'.format(instance.user.id, filename)
class Course(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='course_user')
title = models.CharField(max_length=30)
overview = models.TextField()
created = models.DateTimeField(auto_now_add=True)
video = models.FileField(blank=True, upload_to='videos/') # new
attach = models.FileField(blank=True, upload_to=user_directory_path) # new
class Meta:
"""
内部类设置排序字段,以创建时间的倒序排序
"""
ordering = ('-created',)
def __str__(self):
return self.title
说明
1).新增函数user_directory_path
,返回附件的上传路径。
2).新增字段video、attach
,注意upload_to
的不同写法。
Step2
:迁移数据
python3 manage.py makemigrations course
python3 manage.py migrate
Step3
:配置文件存储位置。
# myproject/mysite/settings.py文件
.
.
.
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Step4
:创建目录myproject/media/
Step5
:增加字段。修改文件myproject/course/forms.py
from django import forms
from .models import Course
class CourseCreateForm(forms.ModelForm):
class Meta:
model = Course
fields = ('title', 'overview', 'video', 'attach')