Django的Template简单来说就是网页的模板机制,利用Template我们可以减少html页面的代码量。一般一个Django项目下会有一个Template文件夹,文件夹里有一个base.html和各个app的子文件夹。一个简单的base.html文件内容如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>
会议室管理系统
</title>
</head>
<a href="/meeting/meetinglist">
会议信息
</a>
<a href="/meeting/roomlist">
会议室信息
</a>
<a href="/meeting/userlist">
人员信息
</a>
<body>
<h1>会议室管理系统 </h1>
{% block content %}
{% endblock %}
{% block footer %}
{# 任何每个页面都可能修改的文本区域的页脚 #}
<p>Thanks for visiting my site! </p>
{% endblock %}
</body>
</html>
这个base.html里保存了所有继承这个模板文件的子网页都要显示的内容,而子网页的内容则显示在{%block content%}和{%endblock%}之间。继承base的其他html文件内容可以如下:
{% extends "base.html" %}
{% block title %} blog list {% endblock %}
{% block content %}
<div class="content">
{% for u in user %}
<div>{{ u.user_id}}<div>
<div>{{ u.name}} </div>
{% endfor %}
</div>
<p>this is user_list </p>
{% endblock %}
如果要使用bootstrap等html的框架,可以在base.html里添加js的依赖。
要在Django中使用文件上传和下载的功能,要先在html里添加下载和上传两个表单
<form enctype="multipart/form-data" method="post" action="/meeting/addfile/">
<input type="file" name="files">
文件名称<input type="text" name="filesname">
<input type="submit" value="上传文件">
</form>
<form action="/meeting/downloadfile/" method="post">
文件名称<select name="filesname">
<option selected>=选择文件名=</option>
{% for file in files %}
<option value="{{ file.filesname }}">{{ file.filesname }}</option>
{% endfor %}
</select>
<input type="submit" value="下载文件">
</form>
然后要在models.py中添加一个文件的表单
class File(models.Model):
files=models.FileField(upload_to='./media/')
filesname=models.CharField(max_length=100)
creation_date=models.DateTimeField()
def __unicode__(self):
return u'%s' %(self.filesname)
其中FileField中的upload_to后面需要写出上传的文件的位置。
最后,再在views.py中添加文件上传和下载的函数,因为涉及到了表单的提交,所以我们再写一个form类
class filesform(forms.Form):
files=forms.FileField()
filesname=forms.CharField(max_length=100)
专门用来处理file表单提交的事物。
@csrf_exempt
def add_file(request):
errors=[]
if request.method=='POST':
form=filesform(request.POST,request.FILES)
if form.is_valid():
m_f=File()
m_f.filesname=form.cleaned_data['filesname']
m_f.creation_date=datetime.today()
m_f.files=form.cleaned_data['files']
m_f.save()
errors.append('file ok')
else:
errors.append('file transportation failed')
return render_to_response("error_list.html",{"errors":errors},context_instance=RequestContext(request))
上传的文件的函数先把POST来的数据赋给form类,然后依次把form中的数据赋值给数据库对象m_f,最后把文件的名字、位置和创建时间保存在数据库中,把文件本身保存在
upload_to的位置中。
@csrf_exempt
def download_file(request):
errors=[]
if request.method=='POST':
if request.POST.get('filesname',''):
f=File.objects.get(filesname=request.POST.get('filesname',''))
filename = f.files.name.split('/')[-1]
response = HttpResponse(f.files, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response
else:
errors.append('file download failed')
return render_to_response("error_list.html",{"errors":errors},context_instance=RequestContext(request))
下载文件的过程则稍微复杂,首先要通过objects获得相应名称的数据库对象,然后通过split函数把这个取得这个对象的文件名之后的这两句
response = HttpResponse(f.files, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
其中application/octet-stream表示
要下载文件的类型。而Content-Disposition
参数本来是为了在客户端另存文件时提供一个建议的文件名。
如果要从网页上删除数据的话,操作也类似之前的描述——首先从数据库中删除这条存储记录,然后在系统中根据数据库的记录找到这个文件,然后删除它。
以上讲的文件上传、下载等功能都是没有经过任何优化的,只适合小型文件的传输,如果涉及到大文件的传输,则需要做很多的优化。