django - 如何将默认静态文件上传到 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)
解决方案
可能是 TLDR
据我所知,static
导演。目的是提供来自 Django 的文件。比如collectstatic
从manage.py
当您./manage.py collectstatic
在 shell 上运行它时,意味着您的静态模块文件将存储到您的static
目录中。
当您的DEBUG为Falsesettings.py
时,Django 不再提供这些文件。这就是为什么你需要先收集静电。
在生产环境中,Django 还建议在生产环境中将DEBUG设置为False,因为当您在服务器/主机上部署时将此设置为True,前端用户可能会知道后端发生了什么,就像您开发应用程序时一样。
如果要上传文件,大多数情况下不建议将文件存储到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
来自:
virtualenv virtualenv
关于虚拟环境
#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/')
默认情况下,您的DEBUG为False
设置为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
)
不要忘记做makemigrations
and/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 应用程序中提供文件有更多的了解。
推荐阅读
- python - 如何计算pandas同一行中包含缺失/ NaN值的列中的行数?
- javascript - 日期过滤器应用于数据表的所有选项卡
- node.js - 带有 Fusionauth passport-oauth OAuth2Strategy 错误的节点:无法获取访问令牌
- java - 当前日期函数在 JPA 中返回昨天的日期
- python - 使用 Python 中的 Selenium 在 YouTube 视频中查找评论数的 CSS 选择器应该是什么?
- oracle - Oracle DB 用户只能在 localhost 上登录
- r - 如何在 Shiny 应用程序中将数据记录到表中
- java - Android Studio:setOnDateChangeListener 不起作用
- linux - 从 Linux 上的 wifi 热点托管问题
- python - Windows 10 上的 Python 套接字问题