在这里建立neverwalkaloner的答案时,我尝试将图像模型属性从CharField迁移到ImageField,然后在MEDIA ROOT
中设置MEDIA URL
和settings.py
。 / p>
我的理解,请阅读文档:
here (how Django handles files),
here (what does MEDIA URL and MEDIA ROOT mean),
和here (what ImageField is and its different arguments),Django将根据ImageField
和设置处理指向特定upload_path
文件的绝对路径。因此,我在外壳中对其进行了测试。到目前为止,它不起作用。
产品更新尝试
在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()调用上载的? 我在做什么错了?
答案 0 :(得分:1)
您不需要在max_length
中添加ImageField
。
如果您想要正确的网址路径,则可以设置如下代码:
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/"
some.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