用户信息
添加用户头像
在用户信息UserProfile中添加ImageField
字段,用于头像上传和显示,而要使用ImageField(或是FileField)必须先进行一些设置:
- 先安装pillow, 迁移时会报错,
PIL
可以可以对图片进行编辑合成等。 - 在setting.py中设置一个
MEDIA_ROOT
作为Django保存文件的完整路径(这些文件并不会保存在数据库中),定义MEDIA_URL
为该目录的基本公共URL。 确保Web服务器的用户帐户可以写入此目录;
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 指定file或image上传目录
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/")
- 将
ImageField
添加到UserProfile模型中,upload_to
选项用以指定用于上传文件的目录(是MEDIA_ROOT
的一个子目录);
class UserProfile(models.Model):
"""为已经使用了内置User模型的项目来拓展用户模型 """
# ...
avatar = models.ImageField(upload_to='avatar/', blank=True, null=True)
- 修改dajngo_ulysses/urls.py,加载图片静态路径
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls', namespace='learning_logs')),
path('users/', include('users.urls', namespace='users')),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- 存储在数据库中的都是文件保存的路径(相对于MEDIA_ROOT)。可以使用
{ {object.<imagefield>.url}}
在模板中获取文件的绝对路径。
修改之前的个人信息显示模板,添加头像的显示:
<div>
{% if user.is_authenticated %}
<img src="{
{ user.profile.avatar.url }}" style="width:250px; height: 250px; position: absolute;"/>
<div style="margin-left: 280px