【问题标题】:Where is the image being uploaded?上传的图片在哪里?
【发布时间】:2016-10-17 09:48:00
【问题描述】:

我在 django 中创建了一个自定义用户模型:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), max_length=254, unique=True)
    first_name = models.CharField(_('first name'), max_length=30)
    image = models.ImageField(_('profile image'), upload_to='userimages/', default = 'user_default.jpeg')

现在我为 django-rest-framework 创建了一个序列化程序来注册一个新用户:

class UserRegistrationSerializer(serializers.ModelSerializer):
    password = serializers.CharField(style={'input_type': 'password'},
                                     write_only=True,
                                     validators=settings.get('PASSWORD_VALIDATORS'))
    image = serializers.ImageField(max_length=None, use_url=True)
    class Meta:
        model = User
        fields = tuple(User.REQUIRED_FIELDS) + (
            User.USERNAME_FIELD,
            User._meta.pk.name,
            'image',
            'password',
        )

    def create(self, validated_data):
        if settings.get('SEND_ACTIVATION_EMAIL'):
            with transaction.atomic():
                user = User.objects.create_user(**validated_data)
                user.is_active = False
                user.save(update_fields=['is_active'])
        else:
            user = User.objects.create_user(**validated_data)
        return user

我的媒体设置是:

import os

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

我的“urls.py”:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('app.urls')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

现在,当我在 /register/ 端点上“发布”时,会创建用户,并且我可以从管理面板中的 url 在浏览器中看到图像。但是当我查看我的项目目录时,图像不存在。我无法弄清楚图像位置。我很确定图像已上传到我的计算机中,因为我尝试从 LAN 上的其他设备上传图像,并且在与另一台计算机断开连接后能够(从浏览器)访问它。

请帮忙。

【问题讨论】:

  • 什么是 BASE_DIR?

标签: python django image django-rest-framework


【解决方案1】:

如果您只想知道文件夹的位置,您可以运行以下命令(在基于 linux 的系统中):

sudo find / -name userimages

【讨论】:

  • 运行后,我发现它已经在/media/userimages/创建了媒体。现在的问题是,我不理解这种行为。
  • 你的意思是你有/media/media/userimages/
  • 只是 /media/userimages/
  • 这是正常行为,您指定了MEDIA_ROOT = os.path.join(BASE_DIR, 'media'),这意味着media 文件夹位于您项目的基础文件夹中。那么upload_to='userimages/' 表示userimages 将在your_project/media/ 中创建
  • 但我的 BASE_DIR 是我项目的根文件夹。正在创建的文件夹在计算机的根目录中
【解决方案2】:

您是正确的,用户上传的文件应该存储在 MEDIA_ROOT 中。

您可以通过启动 Django shell 并检查设置来检查此位置:

$ python manage.py shell
>>> from django.conf import settings
>>> settings.MEDIA_ROOT
<< snip: the media root location >>

【讨论】:

  • 当我硬编码媒体文件夹的路径时,它会被上传到文件夹中。
  • @toothie:但这很奇怪,在你的问题代码中你说 settings.MEDIA_ROOT 是 BASE_DIR + 'media',现在它说 '/media/'?似乎您问题中的代码不是您实际拥有的。
  • 所以在你的文件系统上就是/media/。例如。在文件系统根目录下一个名为“media”的文件夹中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2023-01-30
  • 2018-11-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多