目录:Django 2.1 从零开始搭建博客网站系列
服务器环境搭建(选学)
- 在阿里云服务器从零开始上线Django项目:Ubuntu18.04+Python3+Django2,并通过公网IP访问
小试牛刀——简单的博客网站
- 一、Django2.1 搭建简单的博客网站
- 二、Django2.1 搭建简单的博客网站扩展——自定义模板和静态文件位置
庖丁解牛——多用户的博客网站之用户模块
- 三、Django2.1 搭建多用户的博客网站——登录
- 四、Django2.1 搭建多用户的博客网站——注册
- 五、Django2.1 搭建多用户的博客网站——修改密码
- 六、Django2.1 搭建多用户的博客网站——重置密码
- 七、Django2.1 搭建多用户的博客网站——维护个人详细信息
- 八、Django2.1 搭建多用户的博客网站——头像上传
- 九、Django2.1 搭建多用户的博客网站——用户模块小结
庖丁解牛——多用户的博客网站之文章模块
- 十、Django2.1 搭建多用户的博客网站——文章栏目
- 十一、Django2.1 搭建多用户的博客网站——简单的文章发布
- 十二、Django2.1 搭建多用户的博客网站——使用Markdown发布文章
- 十三、Django2.1 搭建多用户的博客网站——修改和删除文章
- 十四、Django2.1 搭建多用户的博客网站——向用户展示文章
- 十五、Django2.1 搭建多用户的博客网站——文章模块小结
华丽转身——多用户的博客网站之扩展功能
- 十六、Django2.1 搭建多用户的博客网站——文章点赞功能
- 十七、Django2.1 搭建多用户的博客网站——统计文章浏览次数
- 十八、Django2.1 搭建多用户的博客网站——文章评论功能
- 十九、Django2.1 搭建多用户的博客网站——使用自定义模板标签
- 二十、Django2.1 搭建多用户的博客网站——文章标签
- 二十一、Django2.1 搭建多用户的博客网站——美图模块
- 未完待续
项目源码下载:https://github.com/jt1024/lehehe
正文:
当完成了注册和登录之后,网站还会要求用户提供更多的个人信息,所以个人详细信息模块很有必要。
1、个人详细信息的数据模型和表单类
在 ./account/models.py 中新增 UserInfo
class UserInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
school = models.CharField(max_length=100, blank=True)
company = models.CharField(max_length=100, blank=True)
profession = models.CharField(max_length=100, blank=True)
address = models.CharField(max_length=100, blank=True)
aboutme = models.TextField(blank=True)
def __str__(self):
return "user:{}".format(self.user.username)
执行以下命令迁移数据
python manage.py make migrations
python manage.py migrate
此时数据库中新增数据表account_userinfo
在 ./account/forms.py 中新增 UserInfoForm 和 UserForm
from .models import UserInfo
class UserInfoForm(forms.ModelForm):
class Meta:
model = UserInfo
fields = ("school", "company", "profession", "address", "aboutme")
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ("email",)
特别注意:UserForm 的 fields 中不包括 username ,因为 username 一旦确定就不能随便修改,所以在用户详细信息中不允许修改这个字段。
2、个人详细信息的展示
在 ./account/views.py 中新增 myself方法
from django.contrib.auth.decorators import login_required
from .models import UserProfile, UserInfo
from django.contrib.auth.models import User
@login_required(login_url='/account/login')
def myself(request):
user = User.objects.get(username=request.user.username)
userprofile = UserProfile.objects.get(user=user)
userinfo = UserInfo.objects.get(user=user)
return render(request, "account/myself.html", {"user": user, "userprofile": userprofile, "userinfo": userinfo})
修改 ./account/views.py 中新增 user_register 方法
def user_register(request):
if request.method == "POST":
user_form = RegistrationForm(request.POST)
userprofile_form = UserProfileForm(request.POST)
if user_form.is_valid() * userprofile_form.is_valid():
new_user = user_form.save(commit=False)
new_user.set_password(user_form.cleaned_data['password'])
new_user.save()
new_profile = userprofile_form.save(commit=False)
new_profile.user = new_user
new_profile.save()
UserInfo.objects.create(user=new_user) # 新增,增加myself方法后,才添加这行代码
return HttpResponse("注册成功!")
else:
return HttpResponse("抱歉,你不能注册")
else:
user_form = RegistrationForm()
userprofile_form = UserProfileForm()
return render(request, "account/register.html", {"form": user_form, "profile": userprofile_form})
在 ./account/urls.py 中新增如下代码
path('my-information/', views.myself, name='my_information'),
创建 ./templates/account/myself.html
{% extends "base.html" %}
{% block title %}my information{% endblock %}
{% block content %}
My Information
用户名:
{{user.username}}
邮箱:
{{user.email}}
生日:
{{userprofile.birth}}
电话:
{{userprofile.phone}}
毕业学校:
{{userinfo.school}}
工作单位:
{{userinfo.company}}
职业:
{{userinfo.profession}}
地址:
{{userinfo.address}}
个人介绍:
{{userinfo.aboutme}}
picture
{% endblock %}
由于之前注册的用户缺少字段,所以需要重新注册用户,然后登录,登录之后再访问 http://127.0.0.1:8000/account/my-information/ 即可获得以下页面:
3、个人详细信息的修改
在 ./account/views.py 中增加如下代码
from django.http import HttpResponseRedirect
from .forms import UserProfileForm, UserInfoForm, UserForm
@login_required(login_url='/account/login')
def myself_edit(request):
userprofile = UserProfile.objects.get(user=request.user) if hasattr(request.user, 'userprofile') else UserProfile.objects.create(user=request.user)
userinfo = UserInfo.objects.get(user=request.user) if hasattr(request.user, 'userinfo') else UserInfo.objects.create(user=request.user)
if request.method == "POST":
user_form = UserForm(request.POST)
userprofile_form = UserProfileForm(request.POST)
userinfo_form = UserInfoForm(request.POST)
if user_form.is_valid() * userprofile_form.is_valid() * userinfo_form.is_valid():
user_cd = user_form.cleaned_data
userprofile_cd = userprofile_form.cleaned_data
userinfo_cd = userinfo_form.cleaned_data
request.user.email = user_cd['email']
userprofile.birth = userprofile_cd['birth']
userprofile.phone = userprofile_cd['phone']
userinfo.school = userinfo_cd['school']
userinfo.company = userinfo_cd['company']
userinfo.profession = userinfo_cd['profession']
userinfo.address = userinfo_cd['address']
userinfo.aboutme = userinfo_cd['aboutme']
request.user.save()
userprofile.save()
userinfo.save()
return HttpResponseRedirect('/account/my-information/')
else:
user_form = UserForm(instance=request.user)
userprofile_form = UserProfileForm(initial={"birth": userprofile.birth, "phone": userprofile.phone})
userinfo_form = UserInfoForm(initial={"school": userinfo.school, "company": userinfo.company, "profession": userinfo.profession, "address": userinfo.address, "aboutme": userinfo.aboutme})
return render(request, "account/edit_my_infomation.html", {"user_form": user_form, "userprofile_form": userprofile_form, "userinfo_form": userinfo_form})
创建 ./templates/account/edit_my_infomation.html
{% extends "base.html" %}
{% block title %}my information{% endblock %}
{% block content %}
Edit My Information
picture
{% endblock %}
在 ./account/urls.py 中增加如下代码
path('edit-my-information/', views.myself_edit, name="edit_my_information"),
运行 Django,先登录一个账号,然后访问 http://127.0.0.1:8000/account/edit-my-information/,页面如图:
点击 submit,页面如图: