首页 > 解决方案 > 如何将默认静态文件上传到 ImgeField?

问题描述

如果没有提供图像输入但它不起作用,我正在尝试上传我的默认静态图像。它只是添加路径,但没有上传实际的静态图像。

  from django.templatetags.static import static

    def save(self, *args, **kwargs):
        if not self.image:
            self.image = static('images/default-img.png')
        return super().save(*args, **kwargs)

标签: djangodjango-modelsdjango-views

解决方案


可能是 TLDR

据我所知,static导演。目的是提供来自 Django 的文件。比如collectstaticmanage.py

当您./manage.py collectstatic在 shell 上运行它时,意味着您的静态模块文件将存储到您的static目录中。


当您的DEBUGFalsesettings.py时,Django 不再提供这些文件。这就是为什么你需要先收集静电。

在生产环境中,Django 还建议在生产环境中将DEBUG设置为False,因为当您在服务器/主机上部署时将此设置为True,前端用户可能会知道后端发生了什么,就像您开发应用程序时一样。

有关 Django 中的静态文件的更多信息


如果要上传文件,大多数情况下不建议将文件存储到static目录。

改为使用media

服务用户上传的文件的信息


static为了解决这个问题,您可以media在您的settings.py


假设你的项目根目录是这样的:
/base_dir                      #0
|
|
|__ /backend
|  |
|  |
|  |__ /myapp                   #3
|  |  |
|  |  |__ /migrations
|  |  |__ __init__.py
|  |  |__ admin.py
|  |  |__ apps.py
|  |  |__ models.py
|  |  |__ tests.py
|  |  |__ urls.py
|  |
|  |
|  |__ /configuration           #2
|  |  |
|  |  |__ __init__.py
|  |  |__ asgi.py
|  |  |__ settings.py
|  |  |__ urls.py
|  |  |__ wsgi.py
|  |
|  |
|  |__ /media
|  |  |
|  |  |__ default-avatar.png
|  |
|  |
|  |__ /static
|  |  |
|  |  |__ /css
|  |  |__ /js
|  |
|  |
|  |__ manage.py
|
|
|__ /virtualenv                 #1

解释#{编号}
  • #0

    • 你的工作区目录
  • #1

  • #2

    • 来自:
      django-admin startproject configuration backend
      
  • #3

    • 来自:
      ./manage.py startapp myapp
      

好的,现在转到您的settings.py并找到位置:

STATIC_URL = '/static/'

是存在的。

然后将其编辑为:

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
if DEBUG:
    # Mean: during DEBUG == True, or under your development, 
    # it will use this config directories for static and media
    STATICFILES_DIRS = [
        (BASE_DIR / 'static/')
    ]
    MEDIA_ROOT = (BASE_DIR / 'media/')
else:
    # Mean: DEBUG == False, use _ROOT where you also need to collectstatic first
    STATIC_ROOT = (BASE_DIR / 'static/')
    MEDIA_ROOT = (BASE_DIR / 'media/')

默认情况下,您的DEBUGFalse

设置为True然后转到您的 shell/bash,转到manage.py存在的位置并键入:

./manage.py collectstatic

在使用该命令之前还要激活您的 virtualenv

现在您可能会在您的dir的admin目录下看到 admin 静态文件。static


接下来,转到您的urls.py/configuration目录。并编辑/添加:

# assuming this will be a common case for admin url and one application
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings


urlpatterns = [

    # your admin url path
    path('admin/', admin.site.urls),


    # your app/s url/s will be here
    path('', include('myapp.urls')),

]


# increment `static` dir to urlpatterns
urlpatterns += static(
    settings.STATIC_URL,
    document_root=settings.STATIC_ROOT
)
# increment `media` dir to urlpatterns
urlpatterns += static(
    settings.MEDIA_URL,
    document_root=settings.MEDIA_ROOT
)

当您的应用程序启动/重新启动时,这些增量将始终可供 urlpatterns 访问。

对于没有子域的单体应用程序,这是安全的。


models.py是时候在您的应用程序目录下配置您的了。

在这种情况下,您的应用名称是myapp.

/myapp/models.py

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


# anyway, let's say this model is for user account information
class UserAccount(models.Model):
    username = models.OneToOneField(
        User, on_delete=models.CASCADE,
        null=True, blank=True
    )

    # this one is your case
    avatar = models.ImageField(
        default='default-avatar.png' # look what inside `./base_dir/backend/media/`
    )

    first_name = models.CharField(
        max_length=64,
        null=True, blank=True
    )
    last_name = models.CharField(
        max_length=64,
        null=True, blank=True
    )

不要忘记做makemigrationsand/or migrate,然后将该模型注册到admin.py您的应用程序目录下。

/myapp/admin.py

from django.contrib import admin


# import your models
from .models import UserAccount


# register your user account
admin.site.register(UserAccount)

现在你可以runserver测试它了。


事情是,管理员/超级用户也算作用户。

因此,无论何时您想现在/以后将某些文件上传到您的服务器

or

由您自己或活跃用户使用前端逻辑,

所有上传的文件都将存储到media您已经配置的目录中。


查看您的服务器日志。

希望这将使您对在 Django 应用程序中提供文件有更多的了解。


推荐阅读