ChatGPT搭建博客Django的web网页添加用户系统(二)

下一篇:搭建基于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模型中的groupsuser_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

通过为groupsuser_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 的模板包,但是在你的项目中找不到该模板包。

要解决这个问题,有两种可能的方法:

  1. 安装 Bootstrap 模板包: 如果你想使用 Bootstrap 4 的模板样式,确保你的项目中安装了适用于 Bootstrap 4 的 Crispy Forms 模板包。你可以使用以下命令安装:

    pip install django-crispy-forms[bootstrap4]
    
    

    这将安装包含 Bootstrap 4 模板文件的 Crispy Forms 模板包。

    1. 切换到默认的模板包: 如果你不想使用 Bootstrap 4,可以切换回默认的 Crispy Forms 模板包。在你的模板文件中导入 crispy_forms_tags 时,不指定模板包名称,这样将使用默认的模板包。示例:
    {% load crispy_forms_tags %}
    
    
    1. 这样将使用默认的模板包,而不是特定于 Bootstrap 4 的模板包。

    选择适合你项目的方法,并确保在模板中导入了 crispy_forms_tags 并正确使用了 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 继承自 AbstractBaseUserPermissionsMixin,并实现所需的字段。

# 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账号密码

  1. 打开终端或命令提示符,并导航到你的 Django 项目的根目录。

  2. 运行以下命令来创建一个新的超级用户:

    python manage.py createsuperuser
    

    这会提示你输入用户名、电子邮件地址和密码。请按照提示输入信息,并确认密码。

    email: admin@qq.com
    username:admin
    password:admin
    
  3. 创建完成后,你可以使用新创建的超级用户账号和密码登录 Django 管理后台。\

如果你无法通过这种方式重置密码,你还可以通过其他方法来修改或重置密码,比如使用 Django 的管理命令或在数据库中手动修改密码字段。如果你选择手动修改数据库,请确保密码使用合适的哈希算法进行加密。

注册用户在这里插入图片描述

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

在这里插入图片描述

添加更新用户页面

  1. 创建一个视图函数,用于处理用户个人信息的更新请求。
  2. 创建一个表单,用于接收用户更新后的个人信息。
  3. 在模板中显示表单,并允许用户填写和提交更新后的信息。
  4. 更新数据库中的用户信息。

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 装饰器来确保只有登录用户才能访问个人信息更新页面。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值