大作业文档提交

master
arknights8037 3 months ago
parent 12fd9b9d60
commit c6c8b4eb22

8
.idea/.gitignore vendored

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$/src" />
<option name="settingsModule" value="settings.py" />
<option name="manageScript" value="$MODULE_DIR$/src/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
<option name="trackFilePattern" value="migrations" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (DjangoBlog)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Jinja2" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/src/templates" />
</list>
</option>
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="py.test" />
</component>
</module>

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (DjangoBlog)" project-jdk-type="Python SDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/DjangoBlog.iml" filepath="$PROJECT_DIR$/.idea/DjangoBlog.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

Binary file not shown.

Binary file not shown.

Binary file not shown.

@ -62,22 +62,24 @@ class BlogUserChangeForm(UserChangeForm):
# 自定义用户管理类用于在Django管理后台管理用户
class BlogUserAdmin(UserAdmin):
# 指定修改用户信息时使用的表单
form = BlogUserChangeForm
# 指定创建用户时使用的表单
add_form = BlogUserCreationForm
# 定义在用户列表中显示的字段
list_display = (
'id', # 用户ID
'nickname', # 昵称
'username', # 用户名
'email', # 邮箱
'last_login', # 上次登录时间
'date_joined', # 注册时间
'source') # 用户来源
# 定义可以点击进入详情页面的字段
'id',
'nickname',
'username',
'email',
'last_login',
'date_joined',
'source'
)
list_display_links = ('id', 'username')
# 定义用户列表的排序方式
ordering = ('-id',)
# 定义搜索字段
search_fields = ('username', 'nickname', 'email')
search_fields = ('username', 'nickname', 'email')
fieldsets = (
(None, {'fields': ('username', 'password')}),
(_('Personal info'), {'fields': ('email', 'nickname')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)

@ -1,50 +1,18 @@
from django.contrib.auth.models import AbstractUser
# filepath: f:\DjangoBlog\src\accounts\user_login_backend.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import get_user_model
from django.db import models
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from djangoblog.utils import get_current_site
User = get_user_model()
# 创建自定义用户模型继承自Django内置的AbstractUser
class BlogUser(AbstractUser):
# 用户昵称字段存储用户的昵称允许为空最大长度为100字符
nickname = models.CharField(_('nick name'), max_length=100, blank=True)
# 用户创建时间字段,记录用户的创建时间,默认为当前时间
creation_time = models.DateTimeField(_('creation time'), default=now)
# 用户最后修改时间字段,记录用户信息的最后修改时间,默认为当前时间
last_modify_time = models.DateTimeField(_('last modify time'), default=now)
# 用户来源字段记录用户的创建来源如管理后台、第三方登录等允许为空最大长度为100字符
source = models.CharField(_('create source'), max_length=100, blank=True)
def get_absolute_url(self):
"""
获取用户的绝对URL用于跳转到用户的详情页面
例如根据用户名生成用户详情页面的URL
"""
return reverse(
'blog:author_detail', kwargs={
'author_name': self.username}) # 根据用户名生成URL
def __str__(self):
"""
定义对象的字符串表示返回用户的邮箱地址
"""
return self.email
def get_full_url(self):
"""
获取用户的完整URL包括域名和路径
例如https://example.com/author/<username>
"""
site = get_current_site().domain # 获取当前站点的域名
url = "https://{site}{path}".format(site=site,
path=self.get_absolute_url()) # 拼接完整URL
return url
class Meta:
# 定义模型的元数据
ordering = ['-id'] # 默认按ID降序排列
verbose_name = _('user') # 定义模型在管理后台中的单数名称
verbose_name_plural = verbose_name # 定义模型在管理后台中的复数名称
get_latest_by = 'id' # 指定获取最新记录时使用的字段为ID
class EmailOrUsernameModelBackend(ModelBackend):
"""
自定义认证后端支持通过用户名或邮箱登录
"""
def authenticate(self, request, username=None, password=None, **kwargs):
try:
# 尝试通过用户名或邮箱获取用户
user = User.objects.get(models.Q(username=username) | models.Q(email=username))
if user.check_password(password):
return user
except User.DoesNotExist:
return None
Loading…
Cancel
Save