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

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

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

Django身份验证初试-CSDN博客

Django登录注销视图-CSDN博客

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

用户注册

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

from django.contrib.auth.models import User

class UserRegistrationForm(forms.ModelForm):
	password = forms.CharField(label='Passowrd',widget=forms.PasswordInput)
	password2 = forms.CharField(label='Repeat passowrd',widget=forms.PasswordInput)

	class Meta:
		model = User
		fields = ('username','first_name','email')
	
	def clean_password2(self):
		cd = self.cleaned_data
		if 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,UserRegistrationForm

def 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 settings

class 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 static

if 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 = User
		fields = ('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表单。

  • 40
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django框架的用户认证模块可以帮助开发者轻松地实现用户注册、登录、登出等功能。下面是一个简单的示例: 1. 配置settings.py文件 首先需要在settings.py文件中配置以下代码: ```python INSTALLED_APPS = [ # ... 'django.contrib.auth', 'django.contrib.contenttypes', # ... ] AUTH_USER_MODEL = 'myapp.CustomUser' # 自定义用户模型 LOGIN_REDIRECT_URL = 'home' # 登录成功后重定向到该URL LOGOUT_REDIRECT_URL = 'home' # 登出成功后重定向到该URL ``` 2. 创建自定义用户模型 在models.py文件中创建自定义用户模型: ```python from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): # 添加自定义字段 pass ``` 3. 创建注册视图 在views.py文件中创建注册视图: ```python from django.contrib.auth.forms import UserCreationForm from django.urls import reverse_lazy from django.views import generic class SignUpView(generic.CreateView): form_class = UserCreationForm success_url = reverse_lazy('login') template_name = 'signup.html' ``` 4. 创建登录视图 在views.py文件中创建登录视图: ```python from django.contrib.auth.views import LoginView class MyLoginView(LoginView): template_name = 'login.html' ``` 5. 创建登出视图 在views.py文件中创建登出视图: ```python from django.contrib.auth.views import LogoutView class MyLogoutView(LogoutView): template_name = 'logout.html' ``` 6. 创建模板 在templates文件夹中创建signup.html、login.html和logout.html模板文件。 7. 配置URL 在urls.py文件中配置以下代码: ```python from django.urls import path from .views import SignUpView, MyLoginView, MyLogoutView urlpatterns = [ # 注册 path('signup/', SignUpView.as_view(), name='signup'), # 登录 path('login/', MyLoginView.as_view(), name='login'), # 登出 path('logout/', MyLogoutView.as_view(), name='logout'), ] ``` 以上是一个简单的Django用户认证模块的示例,可以根据具体需求进行修改和扩展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值