• django文件上传 和 使用模型来处理上传的文件 限制文件扩展名


    首先再html文件里写

    <form action="" method = 'post' enctype="multipart/form-data">
        <input type="file" name="myfile">    {# 网页会出现选择文件按钮 #}
        <input type="submit" value="提交">
    1. 首先要先填入form标签,在form标签中指定  enctype=‘multipart/form-data’不然就不能上传文件。
    2. 在form标签中添加一个 input 标签,然后指定input标签的name,以及type='file'。

    在视图函数里写:

    from django.shortcuts import render
    from django.views.generic import View
    from django.http import HttpResponse
    # Create your views here.
    class IndexView(View):
        def get(self,request):
            return render(request,'index.html')
        def post(self,request):
            myfile = request.FILES.get('myfile')   #获取文件
            with open('somefile.txt','wb') as wr:    #会生成somefile.txt 文件。
                for chunk in myfile.chunks():
                    wr.write(chunk)
                return HttpResponse('success')

    执行完毕后会生成一个somefile.txt文件,而且文件内容和所选文件的内容一样。

    使用模型来处理上传的文件:

    使用模型可以自动的将文件上传到指定的地方。(要连接数据库)

    from django.db import models
    
    # Create your models here.
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        thumbnial = models.FileField(upload_to='files')   #必须新建一个files文件夹

    模板定义完在视图函数里直接取就好了:

        def post(self,request):
            title = request.POST.get('title')
            content = request.POST.get('content')
            file = request.FILES.get('myfile')     #获取指定的文件
            Article.objects.create(title= title,content=content,thumbnial=file)
            return HttpResponse('success')

    这时文件就已经上传到file文件夹下。

    指定MEDIA_ROOT和MEDIA_URL:

    • MEDIA_ROOT:以后会自动的将文件上传到指定的文件夹中
    • MEDIA_URL:以后可以使用这个指定的路由来访问上传的媒体文件。
      MEDIA_ROOT = os.path.join(BASE_DIR,'media')    #以后会自动将文件上传到指定的文件夹中
      MEDIA_URL = '/media/'   #以后可以使用这个路由来访问上传的媒体文件

      在settings.py中配置

    • 使用MEDIA_URL要在urls.py中配置路由
      from django.conf.urls.static import static
      from django.conf import settings
      urlpatterns = [
          path('', views.IndexView.as_view()),
      ]+static(settings.MEDIA_URL,document_roo = settings.MEDIA_ROOT)

      这样就可以使用  http://127.0.0.1/media/aaa.txt路由来访问上传的文件

    MEDIA_ROOT,upload  用法:

      在模板中定义上传的文件时,可以用upload方法。这样可以将文件在进行详细的分类 ,  便于找到。

    from django.db import models
    
    # Create your models here.
    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        thumbnial = models.FileField(upload_to='files')
        # thumbnial = models.FileField(upload_to='%Y/%m/%d')

      1. media_root和upload同时定义的话,文件会定义到media_root当中但会在media_root指定文件夹下生成一个文件名为upload中定义的子文件。如下图:  

      2. upload后面亦可以跟年月日  【upload_to='%Y/%m/%d'】会按照文件上传的时间进行细分。如下图:

    限制文件扩展名:

      我们经常会在网页上上传文件,我们会发现如果人家需要的是图片,如果你传入文本格式,会有上传失败的错误。这就是我们的限制上传的文件扩展名,来判断上传文件的格式是否正确。

    如果要限制扩展名,就需要用到表单来限制。普通的Form或者ModelForm都是可以的。在模型中使用FileExtensionValidator

    class Article(models.Model):
        title = models.CharField(max_length=100)
        content = models.TextField()
        thumbnial = models.FileField(upload_to='%Y/%m/%d',validators=[validators.FileExtensionValidator(['txt'],message='thumnbnial必须时txt文件')])

    forms.py

    from django import forms
    from .models import Article
    
    class ArticleForm(forms.ModelForm):
        class Meta:
            model = Article
            fields = '__all__'

    上传图片:

    上传图片和其他普通文本是一样的,图片用ImageField。 注意上传图片必须要先安装pillow库。

    pip install pillow

  • 相关阅读:
    游戏《翻转方块》小攻略
    净捡软柿子捏--jQuery 遍历方法
    关于兼容
    sublime
    jQuery中json对象与json字符串互换
    css之IE透明度
    关于优化
    html5+css+div随时笔记
    css3学习--border
    JavaScript学习1
  • 原文地址:https://www.cnblogs.com/nihao2/p/12299605.html
Copyright © 2020-2023  润新知