Django用户注册和用户配置扩展

本篇是在完成用户登录登出,密码修改功能后,扩展用户注册功能。

关于用户登录、注销、更改密码和重置密码。请查看

Django身份验证初试-CSDN博客

Django登录注销视图-CSDN博客

Django密码修改和重置视图-CSDN博客

用户注册

创建一个表单,让用户输入用户名、真实姓名和密码。
编辑位于account应用程序目录中的forms.py文件

from django.contrib.auth.models import Userclass UserRegistrationForm(forms.ModelForm):password = forms.CharField(label='Passowrd',widget=forms.PasswordInput)password2 = forms.CharField(label='Repeat passowrd',widget=forms.PasswordInput)class Meta:model = Userfields = ('username','first_name','email')def clean_password2(self):cd = self.cleaned_dataif cd['password'] != cd['password2']:raise forms.ValidationError("Passwords don't match.")return cd['password2']
  • 表单中包含username,first_name,email字段,这些字段讲根据它们对应的模型进行验证。如果用户填写了一个已经存在的用户名,将得到一个验证错误。因为username是一个用unique=True定义的字段。
  • 添加password和password2两个字段,用来确认密码。
  • 定义了一个clean_password2方法,用于对照第一个密码检查第二个密码,如果密码不匹配,则不让表单验证。这个检查是在调用is_valid方法时完成的。

📌Django可以为任何表单字段提供clean_<fieldname>()方法,清楚特定字段的值或引发表单验证错误。表单还包括一个通用的clean()方法来验证整个表单,这对于验证相互依赖的字段非常有用。

📌Django还提供了一个UserCreationForm表单,它位于Django .contrib.auth.forms中,和刚才创建的表单非常相似。

编辑account应用程序的views.py文件

from .forms import EmailPostForm,CommentForm,SearchForm,UserRegistrationFormdef register(request):if request.method == 'POST':user_form = UserRegistrationForm(request.POST)if user_form.is_valid():new_user = user_form.save(commit=False)new_user.set_password(user_form.cleaned_data['password'])new_user.save()template = "account/register_done.html"context = {'new_user':new_user}return render(request,template,context)else:user_form = UserRegistrationForm()template = "account/register.html"context = {'user_form':user_form}return render(request,template,context)

这里没有保存用户输入的原始密码,而是使用处理加密的用户模型的set_password()方法进行保存,以保证安全。

编辑account应用的urls.py文件,添加如下URL模式:

path('register/',views.register,name='register'),

在account/ template目录下创建一个新模板,命名为register.html,并使其看起来如下:

{% extends "base.html" %}
{% block title %}Create an account{% endblock %}
{% block content %}<h1>Create an account</h1><p>Please, sign up using the following form:</p><form action="." method="post">{{ user_form.as_p }}{% csrf_token %}<p><input type="submit" value="Create my account"></p></form>
{% endblock %}

在同一目录下添加一个模板文件,并将其命名register_done.html。将以下代码添加到其中:

{% extends "base.html" %}
{% block title %}Welcome{% endblock %}
{% block content %}<h1>Welcome {{ new_user.first_name }}!</h1><p>Your account has been successfully created. Now you can <a href="{% url 'login' %}">log in</a>.</p>
{% endblock %}

用户模型扩展

编辑account应用程序的models.py文件

from django.db import models
from django.conf import settingsclass Profile(models.Model):user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)date_of_birth = models.DateField(blank=True, null=True)photo = models.ImageField(upload_to='users/%Y/%m/%d',blank=True)def __str__(self):return 'Profile for user {}'.format(self.user.username)

📌为了保持代码的泛型,请使用get_user_model()方法检索用户模型和AUTH_USER_MODEL设置,以便在定义模型与用户模型的关系时引用它,而不是直接引用auth用户模型。

  • 用户一对一字段允许您将配置文件与用户关联。on_delete参数使用CASCADE,这样当用户被删除时,它的相关配置文件也会被删除。
  • 照片字段是一个ImageField字段。您需要安装Pillow库来处理图像。

在shell中运行以下命令安装Pillow:
python -m pip install pillow

为了让Django在开发服务器上为用户上传的媒体文件提供服务,在项目的settings.py文件中添加以下设置:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
  • MEDIA_URL是为用户上传的媒体文件提供服务的基本URL,
  • MEDIA_ROOT是媒体文件所在的本地路径。
  • Django动态地构建相对于项目路径的路径,以使代码更加通用。

编辑项目的主urls.py文件,修改代码如下:

from django.conf import settings
from django.conf.urls.static import staticif settings.DEBUG:urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

📌Django开发服务器将负责在开发过程中提供媒体文件(也就是DEBUG设置为True时)。
static()辅助函数适合于开发,但不适合生产使用。永远不要在生产环境中使用Django提供静态文件。

编辑account应用程序的admin.py文件,并在管理站点中注册Profile模型,如下所示:

from django.contrib import admin
from .models import Profile@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):list_display = ['user','date_of_birth','photo']

让用户在网站上编辑自己的个人资料。

将以下导入和模型表单添加到account应用程序的forms.py文件中:

class UserEditForm(forms.ModelForm):class Meta:model = Userfields = ('first_name','last_name','email')class ProfileEditForm(forms.ModelForm):class Meta:model = Profile
  • UserEditForm:允许用户编辑自己的名字、姓氏和电子邮件,这些都是Django内置用户模型的属性。
  • ProfileEditForm:这将允许用户编辑我们保存在自定义概要模型中的概要数据。用户将能够编辑自己的出生日期,并上传照片作为个人资料。

编辑account应用程序的views.py文件并导入Profile模型,如下所示:

@login_required
def edit(request):if request.method == 'POST':user_form = UserEditForm(instance=request.user,data=request.POST)profile_form = ProfileEditForm(instance=request.user.profile,data=request.POST,files=request.FILES)if user_form.is_valid() and profile_form.is_valid():user_form.save()profile_form.save()else:user_form = UserEditForm(instance=request.user)profile_form = ProfileEditForm(instance=request.user.profile)template = "account/edit.html"context = {'user_form':user_form}return render(request,template,context)
  • 使用login_required装饰器是因为用户必须经过身份验证才能编辑他们的配置文件。
  • UserEditForm用于存储内置用户模型的数据
  • ProfileEditForm用于存储自定义概要模型中的附加概要数据。
  • 为了验证提交的数据,将执行两个表单的is_valid()方法。如果两个表单都包含有效的数据,将保存两个表单,调用save()方法来更新数据库中相应的对象。

将以下URL模式添加到account应用程序的urls.py文件中:

{% extends "base.html" %}
{% block title %}Edit your account{% endblock %}
{% block content %}<h1>Edit your account</h1><p>You can edit your account using the following form:</p><form action="." method="post" enctype="multipart/form-data">{{ user_form.as_p }}{{ profile_form.as_p }}{% csrf_token %}<p><input type="submit" value="Save changes"></p></form>
{% endblock %}

表单中包含enctype="multipart/form-data"来启用文件上传。
使用HTML表单来提交user_form和profile_form表单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Angular系列教程之路由守卫

文章目录 前言路由守卫的类型CanLoadCanActivateCanActivateChildCanDeactivateResolve总结 前言 在Angular中&#xff0c;路由守卫是一个非常有用的功能&#xff0c;可以帮助我们控制用户在导航过程中的权限和访问限制。通过使用路由守卫&#xff0c;我们可以拦截导航并根据需…

openssl3.2 - 官方demo学习 - signature - EVP_EC_Signature_demo.c

文章目录 openssl3.2 - 官方demo学习 - signature - EVP_EC_Signature_demo.c概述笔记END openssl3.2 - 官方demo学习 - signature - EVP_EC_Signature_demo.c 概述 EC的签名/验签实现, 摘要算法为 SHA3-512 签名验签时的update铭文可以进行多次. openssl的API封装的真好, 只…

python PyQt5的学习

一、安装与配置 1、环境&#xff1a; python3.7 2、相关模块 pip install pyqt5 pyqt5-tools pyqt5designer 可以加个镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple3、配置设计器 python的pyqt5提供了一个设计器&#xff0c;便于ui的设计 界面是这样的&#xff1a…

springboot实现微信小程序授权登录前后端代码完整版

一个简单的微信授权登录的demo&#xff0c;我这边没有建表&#xff0c;是存到redis里面了&#xff0c;仅供参考&#xff0c;后续可以扩展自己的业务逻辑&#xff0c;把登录信息存在表里面。 前端小程序代码&#xff1a; <view><view class"login-icon">…

ABAP - 读取长文本优化

做程序优化的时候发现在循环里面读取长文本&#xff0c;用&#xff08;READ_TEXT\类的方法&#xff09;读取太消耗性能了&#xff0c;于是用读取底表的方法去取。 DATA lt_stxl_raw TYPE TABLE OF ty_stxl_raw.DATA ls_stxl_raw TYPE ty_stxl_raw.DATA lt_tline TY…

MFC为资源对话框添加消息处理函数和初始化控件

现在我VC6新建了一个对话框工程&#xff1b;又在资源添加了一个新的对话框&#xff0c;并为新的对话框添加了名为CTestDlg的类&#xff1b; 在主对话框的cpp文件包含#include "TestDlg.h"&#xff1b; 在主对话框的cpp文件的OnInitDialog()成员函数中&#xff0c;添…

算法之回溯动态规划贪心

回溯使用场景&#xff1a;求出所有可能的解。 List result; void backtrack(路径,选择列表){if(满足结束条件){result.add(路径);return;}for(选择:选择列表){// 遍历集合中的元素做选择;backtrack(路径,选择列表);撤销选择;} }动态规划使用场景&#xff1a;寻求最优解。 #初…

单列的堆叠柱状图

目的 MSingleColumnStackBarChart类被设计用于创建只有单列的堆叠柱状图&#xff0c;用于血糖数据的统计。以下是封装这个类的目的的详细描述&#xff1a; 抽象复杂性&#xff1a; 通过创建MSingleColumnStackBarChart类&#xff0c;你将复杂的MPAndroidChart库的使用和配置封…

12166 - Equilibrium Mobile (UVA)

题目链接如下&#xff1a; Online Judge 一个很简洁的写法&#xff1a;UVa 12166 Equilibrium Mobile——思路题_equilibrium mobile uva - 12166-CSDN博客 才33行&#xff0c;真的NB坏了…… 我的比较繁琐的代码&#xff08;能AC&#xff09;&#xff0c;比较之下就能发现…

VUE---组件的样式冲突scoped

默认情况 &#xff1a;写在组件中的样式会 全局生效 &#xff0c;因此很容易造成多个组件之间的样式冲突问题。 1、 全局样式 &#xff1a; 默认组件中的样式会作用到全局 2、 局部样式 &#xff1a; 可以给组件加上 scoped 属性&#xff0c; 让样式只作用于当前组件 sc…

FastGPT + Xinference + OneAPI:一站式本地 LLM 私有化部署和应用开发

Excerpt 随着 GPTs 的发布,构建私有知识库变得无比简易,这为个人创建数字化身份、第二大脑,或是企业建立知识库,都提供了全新的途径。然而,基于众所周知的原因,GPTs 在中国的使用依然存在诸多困扰和障碍。因此,在当… 随着 GPTs 的发布,构建私有知识库变得无比简易,这…

React全局状态管理

redux是一个状态管理框架&#xff0c;它可以帮助我们清晰定义state和处理函数&#xff0c;提高可读性&#xff0c;并且redux中的状态是全局共享&#xff0c;规避组件间通过props传递状态等操作。 快速使用 在React应用的根节点&#xff0c;需要借助React的Context机制存放整个…

深入探讨 Go 语言中的 Map 类型

深入探讨 Go 语言中的 Map 类型 Go 语言中的 map 类型是一种非常强大且常用的数据结构&#xff0c;它提供了一种键值对的映射关系。本篇博客将深入讨论 Go 中的 map 类型&#xff0c;包括其基本用法、特性、以及一些最佳实践。 基本概念 1. 声明和初始化 在 Go 中&#xff…

mobi文件怎么转换成pdf?

mobi文件怎么转换成pdf&#xff1f;在数字化时代&#xff0c;电子书籍成为了越来越受欢迎的阅读方式。我们可以通过多种格式的电子书来获取知识和娱乐&#xff0c;其中一种常见的格式就是Mobi文件。Mobi文件是亚马逊公司开发的一种电子书格式&#xff0c;它主要用于Kindle设备和…

SL4010升压恒压电源芯片DC3.7V升压5V、12V、24V/5A

SL4010是一款升压恒压电源芯片&#xff0c;可以将DC3.7V的输入电压升压至5V、12V或24V的输出电压&#xff0c;并可提供高达5A的输出电流。这款芯片采用了先进的升压技术&#xff0c;能够实现高效、稳定的电压转换&#xff0c;同时还具有低噪声、低功耗和低成本等优点。在各种需…

【论文阅读】Consistency Models

文章目录 IntroductionDiffusion ModelsConsistency ModelsDefinitionParameterizationSampling Training Consistency Models via DistillationTraining Consistency Models in IsolationExperiment Introduction 相比于单步生成的模型&#xff08;例如 GANs, VAEs, normalizi…

推荐几个Github高星GoLang管理系统

在Web开发领域&#xff0c;Go语言&#xff08;Golang&#xff09;以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统&#xff0c;这些项目星星众多&#xff0c;提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…

学会这个昼夜系统,你也能做出一款饥荒生存类游戏DEMO!

学会这个昼夜系统&#xff0c;你也能做出一款饥荒生存类游戏DEMO&#xff01; 《饥荒》作为生存类游戏的老大哥&#xff0c;深受大家喜爱&#xff0c;这款游戏于2012年年底正式公测上线&#xff0c;距今已有10年的时间&#xff0c;从最初的单机版慢慢推出了联机版&#xff0c;…

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

大模型学习之书生·浦语大模型5——基于LMDeploy大模型量化部署实践

目录 大模型部署背景 LMDeploy部署 量化 TurboMind API server 动手实践环节