本篇是在完成用户登录登出,密码修改功能后,扩展用户注册功能。
关于用户登录、注销、更改密码和重置密码。请查看
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']
Django可以为任何表单字段提供clean_
()方法,清楚特定字段的值或引发表单验证错误。表单还包括一个通用的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 %}
Create an account
Please, sign up using the following form:
{% endblock %}
在同一目录下添加一个模板文件,并将其命名register_done.html。将以下代码添加到其中:
{% extends "base.html" %}
{% block title %}Welcome{% endblock %}
{% block content %}
Welcome {{ new_user.first_name }}!
Your account has been successfully created. Now you can
log in.
{% 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用户模型。
在shell中运行以下命令安装Pillow:
python -m pip install pillow
为了让Django在开发服务器上为用户上传的媒体文件提供服务,在项目的settings.py文件中添加以下设置:
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
编辑项目的主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
编辑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)
将以下URL模式添加到account应用程序的urls.py文件中:
{% extends "base.html" %}
{% block title %}Edit your account{% endblock %}
{% block content %}
Edit your account
You can edit your account using the following form:
{% endblock %}
表单中包含enctype="multipart/form-data"来启用文件上传。
使用HTML表单来提交user_form和profile_form表单。