从本讲起,咱们开始我的中心功能的开发。我的中内心面包括我的资料、修改密码、订阅设置、意见反馈这四部分。经过这部分的开发,咱们将会接触到更多django的用法。html
感兴趣的伙伴可经过网站演示预览网站,登陆后点击右上角头像便可弹出我的中心相关菜单。python
我的中心模块是对用户的信息进行展现并能够编辑。其中我的资料、修改密码、订阅设置是对用户信息的编辑,反馈建议是属于建立新数据。django
这里主要是对我的资料进行编辑,先显示用户原有的信息,而后用户便可对其进行修改并保存,对于编辑功能,django有本身的解决方案,即经过通用视图类UpdateView对模型进行更改。关于Update的介绍,同窗们可查阅官网介绍bash
由于前面已经创建过user模型,因此这里就不用再次创建了,咱们直接使用以前的user模型便可。session
须要咱们作的就是在users/urls.py中添加我的资料的路由,框架
path('profile/<int:pk>/', views.ProfileView.as_view(), name='profile'),
复制代码
能够看到,这里咱们须要传一个int参数作为主键,并传递给视图类ProfileView。ide
下面咱们转向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里面作一些定制的工做,咱们能够传一些本身的参数。post
能够看到咱们还继承了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/<int:pk>/', 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个字段,分别是
写完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次就提示用户操做频繁。
这样咱们就完美的实现了用户反馈。
下面是效果展现
我的资料: