在这里构建neverwalkaloner的答案,我尝试将图像模型属性从CharField迁移到ImageField,然后在settings.py
中设置MEDIA ROOT
和MEDIA URL
。
我的理解,阅读文档:
这里(Django 如何处理文件(,
这里(媒体URL和媒体根是什么意思(,
在这里(ImageField是什么及其不同的参数(,Django将根据upload_path
和设置处理特定ImageField
文件的绝对路径。所以我在外壳中测试了它。到目前为止,它不起作用。
更新了对产品的尝试
在settings.py
:
MEDIA_ROOT = BASE_DIR + '/project' + '/media/'
MEDIA_URL = '/media/'
在models.py
:
from django.db import models
class Product(models.Model):
sku = models.CharField(validators=[isalphanumeric], max_length=20, null=False, blank=False)
image = models.ImageField(upload_to="products/" max_length=20, blank=False, null=False)
在Python Django shell中进行测试:
In [1]: from app.models import Product
In [2]: test_product = Product(sku='alphanumeric23', image='test_product.png')
In [3]: test_product.image.path
Out [3]: 'C:\Users\user\path\to\project\project\media\test_product.png'
但我的预期输出应该是:
'C:\Users\user\path\to\project\project\media\product\test_product.png'
为什么我没有得到正确的网址路径?
是因为它在技术上没有使用 test_product.save(( 调用上传吗? 我做错了什么?
您无需在ImageField
中添加max_length
。 如果你想要一个正确的网址路径,你可以这样设置代码:
urls.py:
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
settings.py:
MEDIA_URL = "/media/"
MEDIA_ROOT = "/path/to/projectdirectory/media/"
一些.html:
{{product.image.url}}
输出网址 :https://hostname/media/products/image.jpg
您还可以添加upload_to= 'products/%Y/%m/%d'
如果你想要这样的输出:
https://hostname/media/products/year/month/date/image.jpg