下一篇:搭建基于Django的博客系统增加广告轮播图(三)
上一篇:ChatGPT创作一个基于Django的简单博客页面(一)
为博客页面创建用户系统
用户系统需求文档
1. 用户注册和登录
- 用户可以通过注册页面创建新账户,并通过登录页面登录。
- 注册页面包含字段:用户名、密码、确认密码。
- 登录页面包含字段:用户名、密码。
2. 用户个人资料
- 用户可以在注册时填写个人资料,包括年龄、性别、喜好等信息。
- 注册后用户可以在个人资料页面查看和编辑个人资料。
- 个人资料页面包含字段:用户名、年龄、性别、喜好。
3. 头像上传和修改
- 用户可以上传自己的头像,并在个人资料页面查看和修改。
- 头像上传应支持常见的图片格式,并限制文件大小。
- 在个人资料页面,用户可以点击头像来修改。
4. 用户标签
- 用户可以为自己添加标签,用于描述自己的特点或兴趣。
- 标签可以是自定义的文本内容。
- 用户可以在个人资料页面查看和编辑标签。
5. 用户信息展示页面
- 系统提供一个用户信息展示页面,展示所有用户的个人资料和头像。
- 用户可以通过该页面浏览其他用户的个人资料和头像。
6. 用户权限控制
- 普通用户只能编辑和查看自己的个人资料和头像。
- 管理员用户具有编辑和查看所有用户资料的权限。
7. 安全性
- 用户密码应以安全的方式进行存储,例如使用哈希算法加密。
- 用户上传的头像应进行验证和过滤,以防止恶意文件上传。
8. 用户界面
- 页面布局应简洁明了,提供良好的用户体验。
- 用户应能够轻松地导航到各个功能页面。
- 用户上传头像时应有明确的指示和反馈。
9. 数据存储和备份
- 用户数据应安全存储,并定期进行备份,以防止数据丢失或损坏。
10. 扩展性和可维护性
- 系统应具有良好的扩展性,以便将来添加更多功能。
- 代码应具有良好的可维护性,易于理解和修改。
以上是对用户系统的详细需求说明,包括用户注册、登录、个人资料管理、头像上传、用户标签、用户信息展示页面等功能。实现这些功能将为博客页面提供更丰富的用户体验和社交功能。
用户注册和登录
见上期,效果如下
首页登录入口
登录页面
用户个人资料
1. 更新用户模型
首先,我们需要更新用户模型以包含年龄、性别和喜好等信息:
# blog/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
age = models.IntegerField(blank=True, null=True)
gender = models.CharField(max_length=10, blank=True)
interests = models.TextField(blank=True)
def __str__(self):
return self.username
2. 创建用户注册表单
接下来,创建一个表单用于用户注册时填写个人资料:
# blog/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser
class SignUpForm(UserCreationForm):
age = forms.IntegerField(required=False)
gender = forms.CharField(max_length=10, required=False)
interests = forms.CharField(widget=forms.Textarea, required=False)
class Meta:
model = CustomUser
fields = ('username', 'password1', 'password2', 'age', 'gender', 'interests')
好的,让我们逐步实现这部分功能:
3. 更新注册视图
然后,更新注册视图以使用新的注册表单:
# blog/views.py
from django.shortcuts import render, redirect
from .forms import SignUpForm
def signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST)
if form.is_valid():
form.save()
return redirect('login') # 注册成功后重定向到登录页面
else:
form = SignUpForm()
return render(request, 'registration/signup.html', {'form': form})
4. 创建个人资料页面
接下来,创建个人资料页面以展示和编辑用户的个人资料:
<!-- templates/registration/profile.html -->
<!DOCTYPE html>
<html>
<head>
<title>Profile</title>
</head>
<body>
<h1>Profile</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>
</body>
</html>
5. 更新URL配置
最后,确保更新URL配置以匹配新的视图:
# blog/urls.py
from django.urls import path
from .views import signup
urlpatterns = [
path('signup/', signup, name='signup'),
]
报错:auth.User.groups: (fields.E304) Reverse accessor 'Group.user_set' for 'auth.User.groups' clashes with reverse accessor for 'blog.CustomUser.groups'.
通过以上步骤,你就可以实现用户在注册时填写个人资料,并在注册后查看和编辑个人资料的功能。
这个错误是由于Django默认的User
模型和我们自定义的CustomUser
模型之间存在冲突引起的。解决方法是通过related_name
参数来给其中一个模型的关联字段重命名。
在这种情况下,我们需要给CustomUser
模型中的groups
和user_permissions
字段添加related_name
参数来避免冲突。以下是如何修改模型的方法:
# blog/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
age = models.IntegerField(blank=True, null=True)
gender = models.CharField(max_length=10, blank=True)
interests = models.TextField(blank=True)
# 添加 related_name 参数来避免冲突
groups = models.ManyToManyField('auth.Group', related_name='custom_user_set', blank=True)
user_permissions = models.ManyToManyField('auth.Permission', related_name='custom_user_set', blank=True)
def __str__(self):
return self.username
通过为groups
和user_permissions
字段添加related_name
参数,我们为这两个字段定义了新的反向关联名称,避免了与默认User
模型的冲突。
问题解决
点击sign up报错,报错``django.template.loaders.app_directories.Loader: D:\PycharmProjects\myblog\blog\templates\registration\signup.html (Source does not exist)
更改signup的文件目的到registration/下,问题解决,Sign Up页面效果如下:
Bootstrap优化signup页面
为了优化注册页面的样式效果,我们可以使用Bootstrap或其他CSS框架来美化表单的外观。以下是一个简单的示例,演示如何使用Bootstrap来美化注册页面:
1. 添加Bootstrap库
首先,确保在你的项目中包含了Bootstrap库。你可以通过 CDN 或下载 Bootstrap 文件来添加到你的项目中。
<!-- 在模板的<head>部分添加Bootstrap样式链接 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
*2. 更新注册模板
然后,在注册页面模板中使用Bootstrap的样式类来美化表单:
<!-- templates/registration/signup.html -->
<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
<!-- 引入Bootstrap样式 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-6">
<h1 class="text-center">Sign Up</h1>
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
{% csrf_token %}
<div class="form-group">
{{ form.username|as_crispy_field }}
</div>
<div class="form-group">
{{ form.password1|as_crispy_field }}
</div>
<div class="form-group">
{{ form.password2|as_crispy_field }}
</div>
<div class="form-group">
{{ form.age|as_crispy_field }}
</div>
<div class="form-group">
{{ form.gender|as_crispy_field }}
</div>
<div class="form-group">
{{ form.interests|as_crispy_field }}
</div>
<div class="form-group">
{{ form.avatar|as_crispy_field }}
</div>
<button type="submit" class="btn btn-primary">Sign Up</button>
</form>
</div>
</div>
</div>
</body>
</html>
在上面的示例中,我们使用了Bootstrap的网格系统来使表单居中显示,并使用了Bootstrap的表单样式类来美化表单元素。同时,我们还使用了Crispy Forms库的 as_crispy_field
过滤器来渲染表单字段,以便与Bootstrap样式配合使用。
报错 TemplateSyntaxError at /signup/ Invalid filter: 'as_crispy_field'
分析问题: 如果 as_crispy_field
过滤器无效,则说明你的项目中可能没有安装或配置 Crispy Forms 库。Crispy Forms 是一个 Django 库,它允许你使用自定义的模板标记来渲染 Django 表单的字段,并且与 Bootstrap 或其他 CSS 框架配合使用。
要解决这个错误,首先确保已经安装了 Crispy Forms 库。你可以使用以下命令来安装:
pip install django-crispy-forms
然后,在你的 Django 项目的 settings.py
文件中添加 Crispy Forms 应用:
INSTALLED_APPS = [
...
'crispy_forms',
...
]
接下来,配置 Crispy Forms 库使用 Bootstrap 样式。在你的 settings.py
文件中添加以下设置:
CRISPY_TEMPLATE_PACK = 'bootstrap4'
完成以上步骤后,重新启动你的 Django 服务器,并确保注册页面的模板中使用了正确的 as_crispy_field
过滤器来渲染表单字段。如果一切设置正确,那么注册页面应该能够正确地使用 Bootstrap 样式来渲染表单字段了。
结果报错;`TemplateDoesNotExist at /signup/ bootstrap4/field.html ’
这个错误表明 Django 没有找到所需的模板文件 bootstrap4/field.html
。这是因为 Crispy Forms 试图使用名为 bootstrap4
的模板包,但是在你的项目中找不到该模板包。
要解决这个问题,有两种可能的方法:
-
安装 Bootstrap 模板包: 如果你想使用 Bootstrap 4 的模板样式,确保你的项目中安装了适用于 Bootstrap 4 的 Crispy Forms 模板包。你可以使用以下命令安装:
pip install django-crispy-forms[bootstrap4]
这将安装包含 Bootstrap 4 模板文件的 Crispy Forms 模板包。
- 切换到默认的模板包: 如果你不想使用 Bootstrap 4,可以切换回默认的 Crispy Forms 模板包。在你的模板文件中导入
crispy_forms_tags
时,不指定模板包名称,这样将使用默认的模板包。示例:
{% load crispy_forms_tags %}
- 这样将使用默认的模板包,而不是特定于 Bootstrap 4 的模板包。
选择适合你项目的方法,并确保在模板中导入了
crispy_forms_tags
并正确使用了 Crispy Forms 的模板标签和过滤器。 - 切换到默认的模板包: 如果你不想使用 Bootstrap 4,可以切换回默认的 Crispy Forms 模板包。在你的模板文件中导入
但是仍旧报错,分析后得出as_crispy_field
参数已经改变了
在以前的版本中,Crispy Forms 使用 as_crispy_field
过滤器来渲染单个字段,但是在较新的版本中,它已经被移除了。
在最新的 Crispy Forms 版本中,你应该直接使用字段对象本身来渲染字段。这意味着你不再需要使用 as_crispy_field
过滤器,而是直接在模板中使用字段对象。以下是一个示例:
{{ form.username }}
在这个示例中,form.username
是一个表单字段对象,它会自动根据 Crispy Forms 的配置来渲染成合适的 HTML 元素。你不需要额外的过滤器来处理它。
确保在你的模板中更新了所有使用 as_crispy_field
过滤器的地方,将它们替换为字段对象本身。这样应该能够解决模板中的错误。
于是,更新后的signup页面如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sign Up</title>
<!-- 引入Bootstrap样式 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-6">
<h1 class="text-center">Sign Up</h1>
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="id_username">Username</label>
{{ form.username }}
</div>
<div class="form-group">
<label for="id_password1">Password</label>
{{ form.password1 }}
</div>
<div class="form-group">
<label for="id_password2">Confirm Password</label>
{{ form.password2 }}
</div>
<div class="form-group">
<label for="id_age">Age</label>
{{ form.age }}
</div>
<div class="form-group">
<label for="id_gender">Gender</label>
{{ form.gender }}
</div>
<div class="form-group">
<label for="id_interests">Interests</label>
{{ form.interests }}
</div>
<div class="form-group">
<label for="id_avatar">Avatar</label>
{{ form.avatar }}
</div>
<button type="submit" class="btn btn-primary">Sign Up</button>
</form>
</div>
</div>
</div>
<!-- 引入Bootstrap的JavaScript -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shCk5KVbZWfGTKwFg8Nq2rs5f8+1F0nLsN6UJ0Z" crossorigin="anonymous"></script>
</body>
</html>
效果如下:
点击signup
按钮无法正确提交,form.errors
报错form.errors:<ul class="errorlist"><li>username<ul class="errorlist"><li>A user with that username already exists.</li></ul></li><li>email<ul class="errorlist"><li>This field is required.</li></ul></li><li>password2<ul class="errorlist"><li>This field is required.</li></ul></li></ul>
将错误信息展示在signup.html
首行
<div class="alert alert-danger">
<ul>
{% for field, errors in form.errors.items %}
{% for error in errors %}
<li>{{ field }}: {{ error }}</li>
{% endfor %}
{% endfor %}
</ul>
</div>
效果如下:
3.用户信息展示页面
修改post_list.html
页面的效果如下,添加左边栏显示user_list功能
<!DOCTYPE html>
<html>
<head>
<title>Blog</title>
<!-- 引入Bootstrap样式 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
</head>
<body>
<div class="container mt-5">
<div class="row">
<div class="col-md-3">
<h2>User List</h2>
<ul class="list-group">
{% for user in user_list %}
<li class="list-group-item">
<a href="{% url 'user_profile' user.id %}">{{ user.username }}</a>
</li>
{% endfor %}
</ul>
</div>
<div class="col-md-9">
<h1>Blog Posts</h1>
<ul>
{% if user.is_authenticated %}
<a href="{% url 'post_create' %}">Create New Post</a>
<a href="{% url 'logout' %}">Logout</a>
{% else %}
<a href="{% url 'login' %}">Login</a>
<a href="{% url 'signup' %}">Sign Up</a>
{% endif %}
{% for post in posts %}
<li>
<h2>
<a href="{% url 'post_detail' post.pk %}">{{ post.title }}</a>
</h2>
<p>{{ post.content }}</p>
<p>Published by: {{ post.author.username }}</p>
{% if user.is_authenticated and user == post.author %}
<a href="{% url 'post_edit' post.pk %}">Edit</a>
<a href="{% url 'post_delete' post.pk %}">Delete</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% block content %}
{% endblock %}
</div>
</div>
</div>
<!-- 引入Bootstrap的JavaScript -->
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-B4gt1jrGC7Jh4AgTPSdUtOBvfO8shCk5KVbZWfGTKwFg8Nq2rs5f8+1F0nLsN6UJ0Z" crossorigin="anonymous"></script>
</body>
</html>
项目报错python -m pip install Pillow
,
解决方法在项目文件夹下执行pip install Pillow
,Pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。
pip install Pillow
效果如下:
用户系统出现了耦合
Django
内置的 User
模型和自定义的CustomerUser
模型没有清晰的区分,出现了部分耦合,导致问题。
1、创建自定义用户模型
创建一个新的用户模型 CustomUser
继承自 AbstractBaseUser
和 PermissionsMixin
,并实现所需的字段。
# models.py
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, username, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, username=username, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, username, password, **extra_fields)
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=30, unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
date_of_birth = models.DateField(null=True, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def __str__(self):
return self.email
2.更新 settings.py
在 settings.py
中添加以下配置,以使用自定义的用户模型:
AUTH_USER_MODEL = 'yourapp.CustomUser'
3.更新表单
更新你现有的用户注册和登录表单,以使用自定义的用户模型:
# forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ('email', 'username')
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = CustomUser
fields = ('email', 'username', 'first_name', 'last_name', 'date_of_birth')
4.更新 admin.py
在 admin.py
中注册你的自定义用户模型,以便在 Django 管理后台中进行管理:
# admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
form = CustomUserChangeForm
model = CustomUser
list_display = ['email', 'username', 'is_staff']
admin.site.register(CustomUser, CustomUserAdmin)
5.迁移数据库
创建并应用数据库迁移,以更新数据库模式:
python manage.py makemigrations
python manage.py migrate
6.更新视图和模板
确保你的视图和模板都使用了自定义的用户模型。以下是一个注册视图的示例:
# views.py
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import CustomUserCreationForm
def signup_view(request):
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect('home')
else:
form = CustomUserCreationForm()
return render(request, 'signup.html', {'form': form})
模板 signup.html
示例:
html复制代码<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
</head>
<body>
<h2>Sign Up</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Sign Up</button>
</form>
</body>
</html>
通过这些步骤,你可以将 Django 内置的用户模型与自定义用户模型分离开来,并支持用户登录、注册和发布博客功能。
报错blog.Post.author: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out. HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
7.更新 Post
模型
在你的 Post
模型中,确保 author
字段指向 settings.AUTH_USER_MODEL
而不是直接指向 auth.User
。
# blog/models.py
from django.conf import settings
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
8.PowerShell迁移数据库
创建并应用数据库迁移,以更新 Post
模型的 author
字段:
Remove-Item -Recurse -Force .\blog\migrations
rm db.sqlite3
python manage.py makemigrations blog
python manage.py migrate
打开http://localhost:8000
,所有数据都清理掉了,结果如下:
添加用户数据
重置administration
账号密码
-
打开终端或命令提示符,并导航到你的 Django 项目的根目录。
-
运行以下命令来创建一个新的超级用户:
python manage.py createsuperuser
这会提示你输入用户名、电子邮件地址和密码。请按照提示输入信息,并确认密码。
email: admin@qq.com username:admin password:admin
-
创建完成后,你可以使用新创建的超级用户账号和密码登录 Django 管理后台。\
如果你无法通过这种方式重置密码,你还可以通过其他方法来修改或重置密码,比如使用 Django 的管理命令或在数据库中手动修改密码字段。如果你选择手动修改数据库,请确保密码使用合适的哈希算法进行加密。
注册用户![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8c63329a0b3943d6b3e1d4c382b14fe1.png#pic_center)
在 signup.html
中渲染 Gender
字段的单选按钮:
<div class="form-group">
<label for="id_gender">Gender</label>
{% for choice in form.gender %}
<label for="{{ choice.id }}" class="horizontal-radio">
{{ choice.tag }} {{ choice.choice_label }}
</label>
{% endfor %}
</div>
在 signup.html
中渲染 interests
字段的多选按钮:
<div class="form-group">
<label for="id_interests">Interests</label>
{% for choice in form.interests %}
<label for="{{ choice.id }}" class="horizontal-radio">
{{ choice.tag }} {{ choice.choice_label }}
</label>
{% endfor %}
</div>
增加is_staff
是否是内部员工字段:
<div class="form-group">
<label for="id_is_staff">Is Staff</label>
{{ form.is_staff }}
</div>
效果如下:
注册进入,可以在administration
管理用户。
返回post_list
页面,仍旧无法更新user list
列表部分,分析原因,更新获取post
视图方法
def post_list(request):
users = CustomUser.objects.all() # 假设你有一个名为 User 的模型,用来存储用户信息
posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'posts': posts, 'user_list': users})
成功展示,效果如下:
添加博客
点击create new post
创建博客,点击保存报错NOT NULL constraint failed: blog_post.author_id
,更新保存方法
@login_required
def post_create(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.author_id = request.user.id
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_form.html', {'form': form})
成功显示post list
页面如下:
个人详情页面
user list
页面添加href
参数为<a href="{% url 'profile' user.pk %}">{{ user.username }}</a>
, 但是报错如下:
添加urls
为:
path('profile/<int:pk>', views.user_profile, name='profile'),
post_list
效果如下:
点击aaa111
进入用户profile
页面如下 http://localhost:8000/profile/2
:
添加更新用户页面
- 创建一个视图函数,用于处理用户个人信息的更新请求。
- 创建一个表单,用于接收用户更新后的个人信息。
- 在模板中显示表单,并允许用户填写和提交更新后的信息。
- 更新数据库中的用户信息。
views.py:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .forms import UserProfileForm
@login_required
def update_profile(request):
if request.method == 'POST':
form = UserProfileForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('profile') # 重定向到用户个人信息页面
else:
form = UserProfileForm(instance=request.user)
return render(request, 'update_profile.html', {'form': form})
forms.py:
from django import forms
from django.contrib.auth.models import User
class UserProfileForm(forms.ModelForm):
class Meta:
model = User
fields = ['first_name', 'last_name', 'email'] # 需要更新的用户信息字段
update_profile.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Update Profile</title>
</head>
<body>
<h1>Update Your Profile</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Update</button>
</form>
</body>
</html>
在这个示例中,使用了外置的CustomUser
模型,并且用户个人信息存储在 CustomUser
模型中。UserProfileForm
表单使用了 User
模型,并且只包含了 first_name
, last_name
, email
等字段。在 update_profile
视图中,使用了 login_required
装饰器来确保只有登录用户才能访问个人信息更新页面。