在我们上一篇文章中我们扩展了Django自带的User模型并实现了用户的登录与注册。在本文里,我们将会开发两个功能页面,一个允许用户登录后查看自己的个人信息,一个允许用户编辑个人资料,并在编辑成功后返回个人信息页。同时我们还将会Django的自带的UserAdmin后台进行扩展,实现对用户扩展信息的直接管理和编辑。本文代码用Django 2.0 + Python 3.X编写。
第一步 重温models.py和urls.py
模型Models设计是Django Web开发的第一步,更多信息见Django 2.0 Web开发核心技术之Models设计。
# users/models.py
fromdjango.dbimportmodels
fromdjango.contrib.auth.modelsimportUser
# Create your models here.
classUserProfile(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='profile')
org = models.CharField(
'Organization',max_length=128,blank=True)
telephone = models.CharField(
'Telephone',max_length=50,blank=True)
mod_date = models.DateTimeField('Last modified',auto_now=True)
classMeta:
verbose_name ='User Profile'
def__str__(self):
return"{}".format(self.user.__str__())
# users/urls.py
fromdjango.urlsimportre_path
from.importviews
app_name ='users'
urlpatterns = [
re_path(r'^register/$',views.register,name='register'),
re_path(r'^login/$',views.login,name='login'),
re_path(r'^user/(?P
\d+)/profile/$',views.profile,name='profile'),
re_path(r'^user/(?P
\d+)/profile/update/$',views.profile_update,name='profile_update'),
re_path(r'^user/(?P
\d+)/pwdchange/$',views.pwd_change,name='pwd_change'),
re_path(r'^logout/$',views.logout,name='logout'),
第二步 编写视图views.py
fromdjango.shortcutsimportrender,get_object_or_404
fromdjango.contrib.auth.modelsimportUser
from.modelsimportUserProfile
fromdjango.contribimportauth
from.formsimportRegistrationForm,LoginForm,ProfileForm,PwdChangeForm
fromdjango.httpimportHttpResponseRedirect
fromdjango.urlsimportreverse
fromdjango.contrib.auth.decoratorsimportlogin_required
defprofile(request,pk):
user = get_object_or_404(User,pk=pk)
returnrender(request,'users/profile.html',{'user': user})
defprofile_update(request,pk):
user = get_object_or_404(User,pk=pk)
user_profile = get_object_or_404(UserProfile,user=user)
ifrequest.method =="POST":
form = ProfileForm(request.POST)
ifform.is_valid():
user.first_name = form.cleaned_data['first_name']
user.last_name = form.cleaned_data['last_name']
user.save()
user_profile.org = form.cleaned_data['org']
user_profile.telephone = form.cleaned_data['telephone']
user_profile.save()
returnHttpResponseRedirect(reverse('users:profile',args=[user.id]))
else:
default_data = {'first_name': user.first_name,'last_name': user.last_name,
'org': user_profile.org,'telephone': user_profile.telephone,}
form = ProfileForm(default_data)
returnrender(request,'users/profile_update.html',{'form': form,'user': user})
views.profile非常好理解。我们重点看下views.profile_update函数是怎么工作的:
我们先从url获取user的主键pk(id), 利用get_object_or_404方法获取需要修改个人资料的用户对象user,然后再利用user获取一一对应的user_profile对象。
当用户通过POST方法提交个人资料修改表单,我们先验证表单ProfileForm的数据是否有效。如果有效,我们将更新过的first_name和last_name数据存入user,再将更新过的telephone和org数据存入user_profile。更新成功返回个人信息页。
如果用户没有提交表单或不是通过POST方法提交表单,我们先获取现有数据生成default_data,利用ProfileForm显示。
ProfileForm实际上是非常简单的,包含了我们允许用户修改的字段。在这个案例里,我们没允许用户修改用户名和电子邮件,所以没有加进去。
# users/forms.py
fromdjangoimportforms
classProfileForm(forms.Form):
first_name = forms.CharField(label='First Name',max_length=50,required=False)
last_name = forms.CharField(label='Last Name',max_length=50,required=False)
org = forms.CharField(label='Organization',max_length=50,required=False)
telephone = forms.CharField(label='Telephone',max_length=50,required=False)
第三步 编写template
#users/templates/users/profile.html
{% block content %}
Account Info
Username: {{ user.username }}
Email: {{ user.email }}
My Profile
First Name: {{ user.first_name }}
Last Name: {{ user.last_name }}
Organization: {{ user.profile.org }}
Telephone: {{ user.profile.telephone }}
{% if user.is_authenticated %}
Edit
|Change Password
|Logout
{% endif %}
{% endblock %}
#users/templates/users/profile_update.html
{% block content %}
Account Info
Username: {{ user.username }}
Email: {{ user.email }}
Update My Profile
{% csrf_token %}
{% for field in form %}
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
{{ field.help_text|safe }}
{% endif %}
{% endfor %}
Logout|
Password change
{% endblock %}
第四步 查看实战效果
下图个人资料页,并包含修改资料,改变密码和退出的链接。
下图是修改个人资料页面:
我们有没有说过,用户只有再登录后才能查看自己个人信息和编辑个人信息?要实现这个功能,我们只需在views.py相应函数前加@login_required这个装饰器,如下所示。我们会再后面专门讲解Django的装饰器。@login_required的作用是检查用户是否已登录,并在用户登录后转到用户试图请求的页面。
第五步 扩展Django自带的User Admin
Django自带的User Admin只能编辑管理基础字段如用户名和电子邮件。我们现在希望能扩展User Admin,在编辑User的同时编辑我们User Profile里的额外字段(如电话)。去实现这个功能,我们只需要按如下代码修改users/admin.py。
下图是实际效果。UserAdmin后多了一栏User Profiles。
本文介绍了如何利用Django 2.0展示用户资料和编辑个人资料,并扩展了Django自带的User Admin。在下文中我们将介绍密码重置和退出。欢迎关注我的微信号【Python与Django大咖之路】获取最新动态。
领取专属 10元无门槛券
私享最新 技术干货