python之路

django笔记(九)-imagefeild\FileFeild

2021-03-08  本文已影响0人  非鱼2018

1.使用imagefile
models.py

class UploadFile(models.Model):
    filename=models.CharField(max_length=50)
    filepath=models.ImageField(upload_to="%Y/%m/%d/")```

settings.py

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

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

forms.py

from .models import UploadFile
class UploadFileForm(forms.ModelForm):
    class Meta:
        model = UploadFile
        fields = ["filepath"]

views.py

from .forms import UploadFileForm
def uploadfile(request):
    if request.method=='GET':
        form=UploadFileForm()
    else:
        form =UploadFileForm(request.POST,request.FILES)
        print(request.POST)
        print(request.FILES)
        if form.is_valid():
            file=form.save(commit=False)
            file.filename=request.FILES['filepath']  #取原始的filename,filepath有时候相同文件,文件名经过处理后会不同
            file.save()
            return HttpResponse('上传成功')
        else:
            print("表单无效")
    content = {'form': form}
    return render(request,'myapp/uploadfile.html',content)

模板文件:

<form action="{% url 'myapp:upload' %}" method="post" enctype="multipart/form-data">
       {% csrf_token %}
<!--        #<input type="file" class="form-file-input" id="customFile">-->
        <input type="file" name="file">
        <input type="submit">
    </form>

url.py,增加

from django.conf import settings
from django.conf.urls.static import static
urlpatterns+=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2.文件下载
views.py

def downfile(request,fileid):
    from .models import UploadFile
    from django.http import FileResponse
    files=UploadFile.objects.get(id=fileid)
    file_path=str(files.filepath)
    file = open('media/{}'.format(file_path), 'rb')
    response = FileResponse(file)
    response['Content-Type'] = 'application/octet-stream'
    response['Content-Disposition'] = 'attachment;filename={}'.format(files.filename)
    return response

*linux服务器上有时可能出现文件名为中文时,下载后文件名乱码的问题,可以对文件名先编码后解码
模板文件

   {% for file in files %}
<p>{{file.filename}}</p>
<a href="{% url 'myapp:downfile' file.id %}">下载</a>

{% endfor %} </ul>

路由:

 path('uploadfile',views.uploadfile,name='uploadfile'),
   path('downfile/<int:fileid>',views.downfile,name='downfile') 
  1. 解决debug=false时,静态文件css失效解决办法:

settings.py,增加

from django.conf import settings
from django.views.static import serve

 re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),
re_path(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
上一篇 下一篇

猜你喜欢

热点阅读