iT邦幫忙

2023 iThome 鐵人賽

DAY 11
1
自我挑戰組

轉職新手學 Django 及 DRF系列 第 11

Day 11 - 使用者註冊及登入功能

  • 分享至 

  • xImage
  •  

今天要來實作的是使用者註冊的功能,開始嘍~

記得啟動虛擬環境!

使用者註冊

在設計 model 時,我們已經為 user 增加一些驗證機制,像 email 跟 password 為必填項目,在index.html中也有新增註冊表格與 http post method,為了實現註冊功能,接下來要做的事情為將使用者請求的資料對應到 model 欄位中,並直接登入。到 core/views.py 把原本的 index 函式修改成這樣:

from django.shortcuts import render, redirect
from django.contrib.auth import get_user_model
from django.http import HttpResponse


def signup(request):

    if request.method == 'POST':
        email = request.POST['email']
        name = request.POST['username']
        password = request.POST['password']

        user = get_user_model().objects.create_user(email=email, password=password, name=name)

        # 新增使用者後直接登入
        user = authenticate(request, username=username, password=password)
        login(request, user)

        return HttpResponse('Sigup and login Success')

    return render(request, 'core/index.html')

HttpResponse 是暫時用來測試請求是否成功,之後會替換掉,也可以傳送後進入管理者頁面去檢查新增的使用者的 email, name,別忘記 url 也要修改:

# 其他程式碼
urlpatterns = [
    path('', views.signup, name='signup'),
]

使用者登入

因為index.html中還有個登入按鈕在等待我們實作登入功能。在 core/views.py 加入以下程式碼:

def login_view(request):
    if request.method == 'POST':
        email = request.POST['email']
        password = request.POST['password']

        user = authenticate(request, email=email, password=password)

        # 若使用者已經存在
        if user is not None:
            login(request, user)
            return HttpResponse('Login Success')
        else:
            return render(request, 'core/index.html')

此段程式碼跟註冊有點類似,差異在會檢查使用者是否已經存在,若不存在則會返回首頁,表示登入失敗,若驗證資訊都正確,則會顯示登入成功訊息。這邊的訊息也是暫時的,之後會再重構。完成 view 後,接著到 core/urls.py,新增 url,對應到剛剛新增的 view:

# 其他程式碼
urlpatterns = [
    # 其他程式碼
    path('login/', views.login_view, name='login'),
]

最後,到 core/templates/index.html 中修改登入按鈕:

            <!-- 其他 HTML -->
            <button type="submit" formaction="{% url 'core:login' %}"
                class="w-full bg-gray-600 text-white py-2 px-4 rounded-md hover:bg-gray-700">
                Log In
            </button>
            <!-- 其他 HTML -->

{% url 'core:login' %}"為另一種模板標籤(template tag),此用法會尋找 urls.py 中名為 login 的 url,前面的 core 為 urls.py 中定義的 app_name。都完成後便大功告成!!大家可以測試看看。

結語

完成了註冊及登入功能,接下來會進行登入後頁面的設計。大家明天見~


上一篇
Day 10 - 剛剛 template 中的 {% csrf_token %} 是什麼?
下一篇
Day 12 - 建立個人資料頁面 & Django ORM
系列文
轉職新手學 Django 及 DRF30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言