博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于django的视频点播网站开发-step6-个人中心功能
阅读量:5745 次
发布时间:2019-06-18

本文共 4313 字,大约阅读时间需要 14 分钟。

从本讲起,我们开始个人中心功能的开发。个人中心里面包括个人资料、修改密码、订阅设置、意见反馈这四部分。通过这部分的开发,我们将会接触到更多django的用法。

感兴趣的伙伴可通过预览网站,登录后点击右上角头像即可弹出个人中心相关菜单。

整体功能

个人中心模块是对用户的信息进行展示并可以编辑。其中个人资料、修改密码、订阅设置是对用户信息的编辑,反馈建议是属于创建新数据。

个人资料

这里主要是对个人资料进行编辑,先显示用户原有的信息,然后用户即可对其进行修改并保存,对于编辑功能,django有自己的解决方案,即通过通用视图类UpdateView对模型进行更改。关于Update的介绍,同学们可查阅

因为前面已经建立过user模型,所以这里就不用再次建立了,我们直接使用之前的user模型即可。

需要我们做的就是在users/urls.py中添加个人资料的路由,

path('profile/
/', views.ProfileView.as_view(), name='profile'),

可以看到,这里我们需要传一个int参数做为主键,并传递给视图类ProfileView。

下面我们转向ProfileView,它的写法超级简单

class ProfileView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):    model = User    form_class = ProfileForm    template_name = 'users/profile.html'    def get_success_url(self):        messages.success(self.request, "保存成功")        return reverse('users:profile', kwargs={'pk': self.request.user.pk})

简单的几行代码,就实现了个人资料的更新,再次彰显了django框架的强大。我们这里继承了UpdateView来实现更新操作,和DetailView类似,我们这里也设置了model和template_name 还有form_class。当更新成功后,django会回调get_success_url来将结果告诉模板,因此我们可以在get_success_url里面做一些定制的工作,我们可以传一些自己的参数。

可以看到我们还继承了LoginRequiredMixin和AuthorRequiredMixin两个类,这两个类属于公共类,其中LoginRequiredMixin的用途是:只允许登录的用户访问该视图类,AuthorRequiredMixin的用途是:只允许用户自己查看自己的个人资料,别人是无法查看的。其中AuthorRequiredMixin的代码位于videoproject/helpers.py。

修改密码

同样的,修改密码也是属于更新操作。

模型当然是用user模型,不必再建。

我们先添加路由

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

修改密码比较特殊,需要对密码进行特殊处理,因此我们通过视图函数change_password来手写代码

def change_password(request):    if request.method == 'POST':        form = ChangePwdForm(request.user, request.POST)        if form.is_valid():            user = form.save(commit=False)            if not user.is_staff and not user.is_superuser:                user.save()                update_session_auth_hash(request, user)  # 更新session 非常重要!                messages.success(request, '修改成功')                return redirect('users:change_password')            else:                messages.warning(request, '无权修改管理员密码')                return redirect('users:change_password')        else:            print(form.errors)    else:        form = ChangePwdForm(request.user)    return render(request, 'registration/change_password.html', {        'form': form    })

代码中,当拿到form之后,通过验证form合法性,然后调用user.save()来保存修改。然后通过update_session_auth_hash来更新session。

这样就实现了修改密码功能。

订阅设置

很多网站都有订阅设置功能,当用户订阅了网站内容之后,网站有了新内容,即向订阅用户推送相关内容。有利于让用户获取网站内容的最新更新。

我们先在users/urls.py下添加订阅功能的路由

path('subscribe/
/', views.SubscribeView.as_view(), name='subscribe'),

我们设置的订阅视图类为SubscribeView,因为订阅的功能和修改个人资料功能类似,也是属于更新操作,所以同样是使用UpdateView来更新。

class SubscribeView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):    model = User    form_class = SubscribeForm    template_name = 'users/subscribe.html'    def get_success_url(self):        messages.success(self.request, "保存成功")        return reverse('users:subscribe', kwargs={'pk': self.request.user.pk})

反馈与建议

这里我们需要在users/models.py下新建一个反馈表,命名为Feedback,

class Feedback(models.Model):    contact = models.CharField(blank=True, null=True, max_length=20)    content = models.CharField(blank=True, null=True, max_length=200)    timestamp = models.DateTimeField(auto_now_add=True, null=True)    class Meta:        db_table = "v_feedback"

该表一共有3个字段,分别是

  • contact 联系方式
  • content 内容
  • timestamp 时间

写完model之后,我们就能写业务代码了。

先添加路由

path('feedback/', views.FeedbackView.as_view(), name='feedback'),

我们设置路由指向FeedbackView视图类。

我们直接贴出FeedbackView的代码

class FeedbackView(LoginRequiredMixin, generic.CreateView):    model = Feedback    form_class = FeedbackForm    template_name = 'users/feedback.html'    @ratelimit(key='ip', rate='2/m')    def post(self, request, *args, **kwargs):        was_limited = getattr(request, 'limited', False)        if was_limited:            messages.warning(self.request, "操作太频繁了,请1分钟后再试")            return render(request, 'users/feedback.html', {'form': FeedbackForm()})        return super().post(request, *args, **kwargs)    def get_success_url(self):        messages.success(self.request, "提交成功")        return reverse('users:feedback')

我们看到这个地方继承的是CreateView类,该类属于新建通用视图类。只要我们配置好model、form_class、template_name,django就自动为我们创建记录。

另外,我们还使用了一种限流量的技术:ratelimit。这是一个第三方类库,通过使用他,可以防止恶意提交数据。它使用超级简单,只需要配置好key和rate即可,key代表业务,rate代表速率,这里我们设置key为ip,即限制ip地址,rate为'2/m',表示每分钟限制请求2次。超过2次就提示用户操作频繁。

这样我们就完美的实现了用户反馈。

下面是效果展示

个人资料:

修改密码:
订阅设置:
反馈建议:

转载地址:http://qoazx.baihongyu.com/

你可能感兴趣的文章
【http】post和get请求的区别
查看>>
TFS强制撤销某个工作区的文件签出记录
查看>>
EL表达式无法显示Model中的数据
查看>>
ps6-工具的基础使用
查看>>
linux下使用过的命令总结(未整理完)
查看>>
时间助理 时之助
查看>>
英国征召前黑客组建“网络兵团”
查看>>
PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)...
查看>>
pyjamas build AJAX apps in Python (like Google did for Java)
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
Javascript String类的属性及方法
查看>>
[LeetCode] Merge Intervals
查看>>
Struts2 学习小结
查看>>
【记录】JS toUpperCase toLowerCase 大写字母/小写字母转换
查看>>
在 Linux 系统中安装Load Generator ,并在windows 调用
查看>>
Visifire charts ToolBar
查看>>
OC中KVC的注意点
查看>>
【洛天依】几首歌的翻唱(无伴奏)
查看>>
tmux不自动加载配置文件.tmux.conf
查看>>
[MOSEK] Stupid things when using mosek
查看>>