從本講起,咱們開始我的中心功能的開發。我的中內心麪包括我的資料、修改密碼、訂閱設置、意見反饋這四部分。經過這部分的開發,咱們將會接觸到更多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次就提示用戶操做頻繁。
這樣咱們就完美的實現了用戶反饋。
下面是效果展現
我的資料:
修改密碼: 訂閱設置: 反饋建議: