• django 上传图片和文件并在页面展示


    在django中创建一个用户的模型:

    class User(models.Model):
        name = models.CharField(max_length=256)
        image = models.ImageField(upload_to='images/')
        introduce = models.FileField(upload_to='introduce/')
    
        def __str__(self):
            return self.name

    模型建好后,执行以下命令在数据库中建表

    # 迁移
    python manage.py makemigrations
    #使模型作用于数据库
    python manage.py migrate

    在项目根目录下创建一个media文件,用来保存上传的图片和文件

    修改settings.py文件,添加如下两行

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

    写一个添加用户的页面模板add.html

    <h1>添加用户</h1>
    <form action="/uploads/add/" enctype="multipart/form-data" method="post">
         {% csrf_token %}
        <label for="username">用户名:</label>
        <input type="text" name="username" id="username"/><br/>
        <label for="img">头像:</label>
        <input type="file" name="img" id="img"/><br/>
        <label for="introduce">简介:</label>
        <input type="file" name="introduce" id="introduce"/><br/>
        <button>提交</button>
    </form>

    在视图文件views.py中添加如下视图函数:

    def add(request):
        if request.method == 'POST':
            name = request.POST.get('username')
            img = request.FILES.get('img')
            introduce = request.FILES.get('introduce')
            user = User(name=name, image=img, introduce=introduce)
            user.save()
            return render(request, 'uploads/add.html', locals())
        return render(request, 'uploads/add.html', locals())

    到这里就可以正常上传图片和文件了。

    下面就是怎么在页面上展示上传的图片和文件内容了。

    修改一级路由urls.py,添加如下内容

    from django.contrib import admin
    from django.urls import path
    from django.urls import include
    from django.conf.urls.static import static
    from django.conf import settings
    
    urlpatterns = [
                      path('admin/', admin.site.urls),
                      path('polls/', include('polls.urls')),
                      path('uploads/', include('uploads.urls')),
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    Django中,如果要在页面加载静态文件,那么必须要在路由中增加static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT),其中MEDIA_URL和MEDIA_ROOT就在我们先前在settings中添加的。

    在视图views.py中新增如下视图函数

    def detail(request):
        user_list = User.objects.all()
        return render(request, 'uploads/detail.html', locals())

    新加一个detail.html的模板页面

    {% for user in user_list %}
        <h1>{{ user.name }}</h1>
        <img src="{{ user.image.url }}" />
        {% for line in user.introduce.readlines %}
            <p>{{ line.decode }}</p>
        {% endfor %}
    {% endfor %}

    这里注意模板文件中的这几点:

    1、user.image获取的是数据库中保存的图片路径,也就是image字段,是一个字符串,如images/02.png,user.image.url就能获取图片在系统中的实际保存路径,类似的用法还有user.image.name:获取图片的名称,user.image.size:获取薄片的大小(字节数)

    2、user.introduce获取的也只是数据库中introduce字段值,是文件的路径,user.introduce.readlines就能打开这个文件并能读取所有行,注意这里读取是b模式(二进制)读取的

    3、line.decode就是将二进制转成字符串

  • 相关阅读:
    时间控件My97DatePicker,实现时间的选择,具体运用
    OnClientClick事件和验证控件同时用的时候,会有问题
    根据Eval()函数绑定的值,来显示GridView中的控件的方法
    打印部分页面内容(Javascript)
    U盘装系统中bios怎么设置USB启动(图文教程)
    TextBox控件只允许输入数字(转)
    JS模态窗体的运用,以及相关注意事项(有用到window.returnValue)
    控件TextBox与验证控件相结合产生的控件(运用)
    linq 实现动态 orderby(根据参数名排序)
    yii 多个数据库链接
  • 原文地址:https://www.cnblogs.com/eastonliu/p/14216974.html
Copyright © 2020-2023  润新知