学习笔记|Django开发|开发过程中遇到的一些问题和解决方案(不定期更新...)

最近学习了Django,并且还自己做了个教学资源管理系统,感兴趣的朋友可以访问项目的github

在看学习视频或教程的时候只是学了一些基本功能,然后在实现一个比较大的项目过程中还是有很多坑的,在此专门花一些时间记录一下学习过程中遇到的坑和搜索到的解决方案,这样以后能及时查找对应的解决方案。

一、下载文件不显示文件名的问题(只显示“下载”两个字而不是实际文件名)

我找了两种解决方案

1、使用escape_url_path

比如你要下载一个excel文件,可以使用下面的方法

from django.utils.encoding import escape_uri_path

response = HttpResponse()
response['Content-Type'] = 'application/vnd.ms-excel'
response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(escape_uri_path(file_name))

但是这个方法在下载其他格式的文件的时候就不顶用了…

2、使用urlquote

这个方法可以用于多种格式的文件下载,反正我试了好几种格式都没啥问题

from django.utils.http import urlquote

file = open(file_path, 'rb')
response = FileResponse(file)
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment;filename="{}"'.format(urlquote(file_name))

二、上传文件路径设置

假设你想在前端上传一个文件到服务器的uploads文件夹下
首先在settings.py文件中添加

MEDIA_URL = 'uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')

然后在model.py中

def task_directory_path(instance, filename):
    return 'tasks/{0}/{1}'.format(instance.pk, filename)
    
class Task(models.Model):
	file= models.FileField(upload_to = task_directory_path)

假设新创建的task的实例的pk为1,上传的文件的名字为test.exe,那么文件上传成功后会保存在 工程目录/uploads/tasks/1/test.exe

三、下载文件路径设置

有时候我们需要下载位于服务器某个位置的资源,那么可以在前端的form里面加入想要get的文件路径

<form action="{% url 'rms:download_resource' resource.pk %}" method="get">
	<input type="hidden" value="{{ MEDIA_URL }}{{ resource.file }}" name="file_path"/>
	<button class="btn btn-success btn-sm" type="submit">下载资源button>
form>

其中MEDIA_URL是之前设置的uploads/,resource.file是要下载的文件的路径
在settings.py文件的TEMPLATES的OPTIONS加入

'django.template.context_processors.media',

在urls.py的urlpattern后面加入

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

如果你想在views.py中获取文件的路径,可以参考:

from django.shortcuts import get_object_or_404
from .model import Resource

filepath = str(settings.MEDIA_URL) + str(get_object_or_404(Resource, pk = pk).file)

四、获取同时满足多个条件的数据对象

有两种方法

1.使用Q

from django.db.models import Q
from .model import Score
from publish.model import TaskScore

score_list = Score.objects.filter(Q(student_id=id)&Q(course_id=course_id))
task_score = get_object_or_404(TaskScore, Q(task_id = task_id)&Q(student_id = student_id))

只要在多个条件之间用&连接起来就可以实现同时满足多个条件的搜索
Q可以在filter和get_object_or_404使用,貌似像Score.objects.get()这样的不行

2.使用字典

from .model import Score

dict = {'student_id': id, 'course_id': course_id}
score_list = Score.objects.filter(**dict)

你可能感兴趣的:(django)