static和media都是存放文件的地方,但是又有区别,以下是两个文件夹的区别和用法
static
定义
static是静态文件,主要存的是CSS, JavaScript, 网站logo等不变的文件。
配置
配置settings.py
STATIC_URL = '/static/' # 静态文件别名(相对路径) 和 绝对路径
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'app01/static'),
)
# STATIC_ROOT 配置部署的时候才用
使用
在项目中将模板层用到的静态文件都放入该文件夹中,做好解耦
media
定义
media主要用来保存用户上传的文件,例如图片等
配置
配置settings.py
MEDIA_URL = "/media/" # 媒体文件别名(相对路径) 和 绝对路径
MEDIA_ROOT = (
os.path.join(BASE_DIR, 'app01/media')
)
配置路由
from django.urls import path,include,re_path
from blog import views
from django.views.static import serve
from .settings import MEDIA_ROOT
urlpatterns = [
# ... the rest of your URLconf goes here ...
re_path('/media/(?P<path>.*)',serve,{'document_root': MEDIA_ROOT})
使用
在models.py中使用
from django.db import models
class UserInfo(models.Model):
username = models.CharField(verbose_name='用户名', max_length=32)
avatar = models.FileField(verbose_name='头像', upload_to='upload/avatar/')
在view.py中使用
def register(request):
if request.method=='POST':
# print(request.POST)
response={'user':None,'msg':None}
form=UserForm(request.POST)
if form.is_valid():
username=form.cleaned_data.get('username')
pwd=form.cleaned_data.get("pwd")
email=form.cleaned_data.get('email')
telephone=form.cleaned_data.get('telephone')
#获取上传的文件对象
avatar_obj=request.POST.FILES.get('avatar')
#直接将文件对象传入models函数
user_boj=UserInfo.objects.create_user(
username=username,
password=pwd,
email=email,
telephone=telephone,
avatar=avatar_obj,
)
else:
response['msg']=form.errors
print(form.errors)
return JsonResponse(response)
form=UserForm(request.POST)
return render(request,'register.html',locals())
upload_to相当于上传到app01/media/upload/avatar/目录下。
如果不设置media,文件将直接上传到根目录下。
FileField或ImageField字段适用于存储文件/图片,出于性能考虑,文件并不直接保存到数据库,而是保存在文件系统里,因此该字段只是记录一个路径而已。
这个路径是相对于MEDIA_ROOT的,要想得到文件/图片的绝对路径,需要用.url方法。比如,要在页面中显示用户user_obj的头像,那么在模板中可以这样写:
<img src="{{ user_obj.avatar.url }}" alt="user_avatar">