Django 用户配置文件
在本系列的今天部分中,我们将通过添加个人资料图片和个人简介等附加信息来为用户创建个人资料。
首先,让我们在views.py中创建一个配置文件视图
视图.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
return render(request, 'users/profile.html')
- 我们稍后将修改此视图以让用户更新他们的个人资料。
- 装饰
login_required
器限制已登录用户的访问。 - 未登录的用户无法访问个人资料页面。如果用户尝试访问,系统会通过在查询字符串中传递当前绝对路径,
login_required()
将用户重定向到(我们在本系列的登录/注销settings.LOGIN_URL
部分中设置的)页面。例如:/login/?next=/profile/
- 从示例路径中我们可以看到,该函数会跟踪用户尝试访问的页面。因此,在身份验证成功后,它会将用户重定向到他们最初请求的个人资料页面。
打开用户应用程序urls.py并添加个人资料视图的路线。
用户/urls.py
from django.urls import path
from .views import profile
urlpatterns = [
# Add this
path('profile/', profile, name='users-profile'),
]
在用户应用程序模板目录中创建视图的模板。
个人资料.html
{% extends "users/base.html" %}
{% block title %}Profile Page{% endblock title %}
{% block content %}
<div class="row my-3 p-3">
<h1>This is the profile page for {{user.username}}</h1>
</div>
{% endblock content %}
- 我们稍后将修改此模板以显示用户的个人资料,但首先我们需要做几件事。
使用一对一链接扩展用户模型
现在是时候对我们的个人资料进行建模,以便将用户的个人资料图片和个人简介字段存储在数据库中。
当我们想要存储与身份验证无关的用户附加信息时,我们可以创建一个与用户一对一链接的新模型。
在 django 中,我们可以通过使用模型字段在模型之间创建一对一的关系OneToOneField
。
- 在一对一关系中,一个表中的一条记录通过外键与另一个表中的一条且仅一条记录关联。例如,一个用户模型实例与一个且仅一个个人资料实例关联。
好了,让我们创建一个包含两个字段的个人资料模型:头像(头像)和个人简介。你可以根据需要添加更多字段。
模型.py
from django.db import models
from django.contrib.auth.models import User
# Extending User Model Using a One-To-One Link
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(default='default.jpg', upload_to='profile_images')
bio = models.TextField()
def __str__(self):
return self.user.username
- 第一个参数
OneToOneField
指定当前模型与哪个模型关联,在本例中是User模型。第二个参数on_delete=models.CASCADE
表示如果删除了用户,则同时删除其个人资料。 ImageField
的第一个参数default='default.jpg'
是当用户未自行上传图片时,系统默认使用的图片。第二个参数upload_to='profile_images'
是图片上传到的目录。- 个人简介只是一个文本字段,用于存储有关用户的一些信息。
- dunder
__str__
方法将对象转换为其字符串表示形式,这使得打印个人资料实例时更具描述性和可读性。因此,每当我们打印用户的个人资料时,它都会显示其用户名。
好吧,为了实现这个功能,我们需要一个库。你以前用 Python 处理过图像吗?如果是的话,你可能知道pillow
哪个库是最常见的图像处理库之一,它允许我们在 Python 中进行不同类型的图像操作。
Django 要求我们在使用时安装这个库ImageField
,因此请转到您的终端并输入以下内容。
pip install pillow
为了使更改在我们的数据库中生效,让我们运行迁移。
python manage.py makemigrations
python manage.py migrate
- 另一个重要步骤是在用户应用程序admin.py中注册配置文件模型。
管理员
from django.contrib import admin
from .models import Profile
admin.site.register(Profile)
- 上面的代码导入了profile模型,然后调用
admin.site.register
进行注册。
您现在可以登录管理面板并查看我们创建的模型。
用户上传的文件/处理图像
在 django 中处理媒体文件时,我们必须更改一些设置以在本地存储文件并在需要时提供它们。
具体来说,我们需要在设置中设置 MEDIA_URL 和 MEDIA_ROOT。
MEDIA_ROOT
是存储上传文件的目录的完整路径。通常,我们会在项目根目录下创建一个目录来存储此类文件。MEDIA_URL
是提供媒体文件的基本 URL。它使我们能够通过 Web 浏览器访问媒体。
设置.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
现在我们应该配置项目的urls.py以在开发期间(当 debug=True 时)提供用户上传的媒体文件。
用户管理/urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
我们现在可以在媒体根文件夹中添加文件,django 将从媒体 URL 为它们提供服务。
-
从上图可以看出,用户上传的个人资料图片将保存在 中
/media/profile_images/your_image
。在我们创建用户上传图片的前端之前,您可以前往管理面板并为注册用户创建图片,以查看这一切是否运行正常。 -
提供给用户的默认个人资料图片位于其中,
/media/
因此,请将您想要的任何默认图像放在名为 的目录中default.jpg
。
Django 中的信号
请注意,每次创建用户时,我们都必须前往管理页面创建配置文件,但我们不想每次都这样做。如果我们能在创建新用户时自动创建配置文件就太好了。为此,我们使用了信号。
但是信号是什么?
信号用于对数据库中的特定条目的修改/创建执行某些操作。
在信号中,我们有以下基本概念。
- 发送方:通常是当事件发生时通知接收方的模型。
- 接收器:接收器通常是一种函数,一旦它收到某些操作的通知,它就会对数据进行处理,例如当用户实例即将保存在数据库中时。
- 发送者和接收者之间的连接是通过“信号调度器”完成的。
用例:- 使用信号,我们可以在数据库内创建新用户实例时创建配置文件实例。
Django 建议我们将信号作为单独的模块放在应用程序目录中。因此,在用户应用程序中创建一个signals.py文件。
信号.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
create_profile
是每次创建用户时运行的接收器函数。- 用户是负责发出通知的发送者。
post_save
是在保存方法结束时发送的信号。- 一般来说,上面的代码所做的是在 User 模型的
save()
方法执行完成后,它post_save
向接收函数()发送一个信号(create_profile
),然后该函数将接收信号以创建并保存该用户的配置文件实例。
下一步是ready()
通过导入信号模块,在应用程序配置的方法中连接接收器。打开apps.py,我们可以在其中添加用户应用程序的任何配置。
应用程序.py
from django.apps import AppConfig
class UserConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'users'
# add this
def ready(self):
import users.signals # noqa
- 我们所做的是覆盖
ready()
用户应用程序配置的方法来执行注册信号的初始化任务。
现在我们已经掌握了上述内容,在下一部分中,我们将创建一个表单,用户可以在其中更新他们的个人资料并在模板中显示信息。
您可以在github中找到完成的应用程序。
欢迎任何意见和建议。
鏂囩珷鏉ユ簮锛�https://dev.to/earthcomfy/django-user-profile-3hik