django 为什么我的图像不能保存到我的媒体目录?

bxjv4tth  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(133)

我正在使用Django。当我提交表单时,我的图像正在保存,但它没有保存到我的媒体目录。它只是保存文件。例如,它保存为“file.png”而不是“avatars/file.png”。我会注意到它是在管理门户中保存的。
以下是我的文件:

from django.db import models
from django.contrib.auth import get_user_model

class Profile(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
    avatar = models.ImageField(default='avatars/Screenshot_2022-11-30_at_7.18.28_PM.png', upload_to='avatars/')
    header = models.FileField(default='headers/Screenshot_2022-11-30_at_7.18.28_PM.png', upload_to='headers/')
    followers = models.ManyToManyField(get_user_model(), related_name='followers', blank=True)
from django.shortcuts import render, redirect, HttpResponseRedirect
from django.contrib.auth import get_user_model
from django.views.generic import ListView, DetailView, View
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Profile

def updateProf(request):

    Profile.objects.filter(user_id=request.POST['user_id']).update(avatar=request.FILES['avatar'])
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
{% extends 'base.html' %}
{% load crispy_forms_tags %}

{% block content %}
<div class="signup-form">
    <h2>Edit profile</h2>
    <form method="post" action="/update-prof" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="hidden" name="user_id" value="2">
        <input type="file" name="avatar">
        <button class="btn btn-success" type="submit">Save changes</button>
    </form>
</div>
{% endblock %}

和我的设置/url文件:
一个三个一个
我原以为添加enctype字段/request.FILES可以解决这个问题,但它没有。有人知道如何将文件保存到avatars/吗?

g52tjvyc

g52tjvyc1#

.update()方法在数据库级别工作,将忽略upload_to。如果使用了相同的文件名,它也可能会覆盖其他用户的头像,而实际上它应该使用唯一的文件名来存储文件。
正确的方法是使用适当的表单根据用户输入更新数据,但如果您很着急,这也应该可以:

try:
    profile = Profile.objects.get(user_id=request.POST['user_id'])
    profile.avatar = request.FILES['avatar']
    profile.save()
except Profile.DoesNotFound:
    return HttpResponseNotFound("User not found")

相关问题