基於django的視頻點播網站開發-step6-我的中心功能

從本講起,咱們開始我的中心功能的開發。我的中內心麪包括我的資料、修改密碼、訂閱設置、意見反饋這四部分。經過這部分的開發,咱們將會接觸到更多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個字段,分別是

  • 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次就提示用戶操做頻繁。

這樣咱們就完美的實現了用戶反饋。

下面是效果展現

我的資料:

修改密碼:
訂閱設置:
反饋建議:
相關文章
相關標籤/搜索