Django开发综述2

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 参数本来是为了在客户端另存文件时提供一个建议的文件名。
如果要从网页上删除数据的话,操作也类似之前的描述——首先从数据库中删除这条存储记录,然后在系统中根据数据库的记录找到这个文件,然后删除它。

以上讲的文件上传、下载等功能都是没有经过任何优化的,只适合小型文件的传输,如果涉及到大文件的传输,则需要做很多的优化。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值