关于Django图片上传

  • 首先要设置settings
# 上传文件
MEDIA_ROOT = 'media'  # 项目下的目录
MEDIA_URL = "/media/"  # 跟STATIC_URL类似,指定用户可以通过这个url找到文件
  • setting 设置模板中使用MEDIA_URL
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',

                'django.template.context_processors.media',
            ],
        },
    },
]
模板中使用MEDIA_URL

 

  • url中要设置
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
#省略中间url
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

  • models设置图片字段和保存位置
class UserProfile(models.Model):
    username = models.ForeignKey(User, related_name='User_Profiles', on_delete=models.CASCADE)
    avatar = models.FileField(upload_to='avatar', blank=True,null=True, verbose_name='头像')

如上将会保存在/media/avatar目录下

  • HTML页面
                        <form role="form" enctype="multipart/form-data" action="{% url 'upload_avatar' %}"
                              method="POST">
                            {% csrf_token %}
                            <div>
                                {% for img in imgs %}
                                    <img src="{{ user.User_Profiles.first.avatar }}" alt="">
                                {% endfor %}
                            </div>
                            <div>
                                <input class="btn-success" type="file" name="img">
                                <button class="btn btn-success" type="submit">变成头像</button>
                            </div>
                        </form>
HTML代码
  • views后端保存图片
def upload(request):
    if request.method == 'POST':
        # 如果有头像,先删除照片再删除数据库
        if not UserProfile.objects.filter(username=request.user, avatar=''):
            project_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
            media_path = os.path.join(project_path, 'media')
            print(media_path)
            try:
                avatar_name = request.user.User_Profiles.first().avatar.name
                avatar_path = os.path.join(media_path, avatar_name)
                os.remove(avatar_path)
            except Exception as e:
                print(e)
            UserProfile.objects.filter(username=request.user).delete()

        new_img = UserProfile(username=request.user, avatar=request.FILES.get('img'))
        new_img.save()
        return redirect('my_account')
后端保存图片

 

posted @ 2020-02-28 16:03  Neroi  阅读(176)  评论(0编辑  收藏  举报