สอนใช้ LoginView ใน Django 1.11+

February 14th, 2017
สอนใช้ LoginView ใน Django 1.11+

เนื่องจากตอนนี้ Django เวอร์ชั่น 1.11 ขึ้นไป มีการใช้ class LoginView ซึ่งทำให้เราทำ Login ได้ง่ายมาก เลยอยากแชร์เก็บไว้เผื่อโปรเจคอื่นๆ อยากจะเอาไปใช้บ้างอ้างอิงจาก document นี้ แล้วก็บทความนี้ใช้เวอร์ชั่น 1.11a กับ Python 3.6 นะคะ

Requirement:

ต้องการหน้า login ที่มีช่องให้ใส่ username, password และกดปุ่ม login แบบกากๆ ไม่มีความสวยงามใดๆ ยังไม่ต้องการ CSS ขอให้ใช้งานได้อย่างถูกต้องก็พอ

Implementation:

  1. ทำตัว template ซึ่งถ้าอยากใช้ฉบับ basic ก่อน ก็สามารถ copy จากลิงค์ด้านบนได้เลย ตรงที่บอกว่า เป็น Sample ของ registration/login.html โดยสมมติว่าเรามี base.html อยู่แล้ว และ login ของเราก็ extend จาก base.html นี้ เราจะเอา login.html ไว้ตรงไหนก็เรื่องของเรา แค่ใส่ใน urls ให้ถูกก็พอ ถ้าเป็นตัวอย่างนี้ จะเอาใส่ไว้ใน templates/login.html เลย
  2. ใน settings.py เพิ่มสิ่งนี้เข้าไป
    LOGIN_URL = '/login/'
    LOGIN_REDIRECT_URL = '/'

    จะทำให้มันไปหน้า login ตาม url /login/ และเวลา login เสร็จแล้ว ก็จะ redirect ไป / ถ้าเราอยากเปลี่ยนเป็นอย่างอื่น ก็เปลี่ยนได้ แต่ถ้าไม่ตั้งค่านี้ไว้ มันจะใช้ตาม default คือ หน้า login จะไปยัง accounts/login/ และ redirect ไปยัง accounts/profile/

  3. ใน urls.py ให้ใส่ url สำหรับ login/logout ไว้ดังนี้ (อันนี้แบบ logout แล้วให้กลับมาหน้า login)
    from django.conf.urls import include, url
    from django.contrib.auth import views as auth_views
    
    urlpatterns = [
        url(r'^login/$', auth_views.LoginView.as_view(
            template_name='login.html'), name='login'),
        url(r'^logout/$', auth_views.LogoutView.as_view(
            template_name='login.html'), name='logout'),
    ]
  4. อยากให้ view ไหน ต้อง login ก่อนใช้งาน ก็จัด decorator login_required ครอบ url เลย เช่น
    from django.contrib.auth.decorators import login_required
    
    ...
    url(r'^$', login_required(BoardView.as_view()), name='boards'),
    ...
    
  5. เวลาใส่ลิงค์ใน template ก็ใส่แบบนี้ได้เลย
    a href="{% url 'login' %}"
    a href="{% url 'logout' %}"

ห้ะ! เสร็จละเหรอ แค่เนี้ยยยยะ อีกนิดจะเป็นง่อยละ 55555555+ จะเห็นว่า ไม่ต้องทำไรใน views.py ละ เค้าจัด get กับ post มาให้เสร็จแล้ว ใช้อย่างเดียว ประมาณว่าการ login ก็ทำแบบนี้ทั้งโลกแหละ แต่ถ้าใครจะทำอะไรที่ advance กว่านี้ ก็ไปทำเอาเองนะ