Django by example Book

Building a Social Website with Django – Phần 5

Dịch từ: Django by example – Antonio Melé

Trong Phần 5 của series này, chúng ta sẽ cover qua các phần sau:

  • Cho phép User đăng ký tài khoản trên website.
  • Cho phép User có thể chỉnh sửa profile.

USER REGISTRATION AND USER PROFILES

User tồn tại trong hệ thống bây giờ có thể login, logout, thay đổi password, và reset password nếu họ quên nó. Bây giờ, chúng ta cần xây dựng view cho phép khách viếng thăm có thể tạo tài khoản để sử dụng hệ thống.

User Registration

Để tạo một view đơn giản cho phép người dùng đăng ký trên website của chúng ta, trước hết chúng ta tạo một form để người dùng có thể điền username, tên thật của họ và password. Thay đổi file forms.py trong thư mục ứng dụng account và thêm vào đoạn code sau:

phan5 (1)

Chúng ta đã tạo một model form cho model User. Trong form chúng ta chỉ bao gồm các field username, first_nameemail cho model. Các field này sẽ được validate dựa trên các model fields tương ứng. Ví dụ, nếu người dùng chọn một username đã tồn tại trong hệ thống, họ sẽ nhận được một thông báo lỗi. Chúng ta có thêm 2 fields là password password2 cho người dùng thiết lập password và xác nhận nó. Chúng ta cũng có định nghĩa một method clean_password2() để kiểm tra xem password confirm với password ban đầu có khớp hay không. Chúng ta sẽ gọi method is_valid() để kiểm tra trường hợp này. Bạn có thể tạo một method clean_<fieldname>() cho bất kỳ field nào của form để validate data và hiển thị lỗi cho field xác định. Forms cũng bao gồm một method clean() để validate toàn bộ form, hữu ích cho việc validate các field phụ thuộc và các field khác.

Django cũng cung cấp một form UserCreationForm để bạn có thể sử dụng nằm trong django.contrib.auth.forms và trông rất giống với form mà chúng ta đã tạo.

Thay đổi file views.py của ứng dụng account và thêm vào đoạn code sau:

phan5 (2)

View để tạo tài khoản người dùng khá đơn giản. Thay vì lưu password thô nhập bởi người dùng, chúng ta sử dụng method set_password() của model User để xử lý mã hóa an toàn trước khi lưu.

Bây giờ, thay đổi file urls.py của ứng dụng account và thêm vào URL pattern sau:

phan5 (3)

Cuối cùng, tạo một template mới trong thư mục template account/  và đặt tên register.html, và thêm vào đoạn code sau:

phan5 (4)

Tạo một file template trong cùng thư mục và đặt tên là register_done.html . Thêm vào đoạn code sau:

phan5 (5)

Bây giờ, mở http://127.0.0.1:8000/account/register/ trên trình duyệt. Bạn sẽ nhìn thấy page registration hiển thị như sau:

phan5 (6)

Điền thông tin chi tiết cho user mới và click Create My Account button. Nếu tất cả fields hợp lệ, user sẽ được tạo và bạn sẽ nhìn thấy message hiển thị như sau:

phan5 (7)

Click link log-in và điền username và password để xác nhận tài khoản bạn vừa tạo.

Bây giờ, bạn cũng có thể thêm vào link registration trong template login. Thay đổi template registration/login.html và thay thế dòng sau:

<p>Please, use the following form to log-in:</p>

…với đoạn sau:

phan5 (8)

Như vậy là chúng ta đã tạo link truy cập page sign-up từ page login.

phan5 (9)

Extending the User Model

Khi bạn làm việc với tài khoản người dùng, bạn sẽ nhận ra model User  trong authentication framework của Django phù hợp trong hầu hết các trường hợp. Tuy nhiên, model User chỉ chứa các field cơ bản. Bạn ước rằng có thể mở rộng model User bao gồm nhiều thông tin hơn. Cách tốt nhất để làm điều này là tạo một profile model chứa tất cả các thông tin liên quan đến User và một qua hệ một-đến-một với model User trong Django.

Thay đổi file models.py của ứng dụng account và thêm vào đoạn code sau:

phan5 (10)

Field user one-to-one cho phép chúng ta tổ chức profile với user. Field photo là một field ImageField. Bạn sẽ cần cài đặt một package trong Python để quản lý hình ảnh, đó là PIL (Python Imaging Library) hay Pillow, là một nhánh của PIL. Cài đặt Pillow bằng cách thực hiện các lệnh sau trong shell của bạn:

phan5 (11)

Để Django xử lý file media được upload bởi user với development server, thêm vào cài đặt trong file setting.py của project:

phan5 (12)

MEDIA_URL dựa trên URL để phục vụ file media upload bởi user, và MEDIA_ROOT  là đường dẫn local để chứa chúng. Chúng ta xây dựng đường dẫn tự động liên quan đến đường dẫn của project để tạo cho code nhiều tương đồng.

Bây giờ, sửa file urls.py của project bookmarks và chỉnh sửa code theo sau:

phan5 (13)

Bằng cách này, các máy chủ Django sẽ quản lý các files media trong môi trường phát triển.

Function helper static() phù hợp trong môi trường phát triển nhưng không thích hợp trên môi trường production. Đừng bao giờ sử dụng các files static của bạn với Django trên môi trường production.

Mở command line và chạy lệnh sau để tạo database migration cho model mới:

phan5 (14)

Tiếp theo, đồng bộ database với lệnh sau:

phan5 (15)

Chỉnh sửa file admin.py của ứng dụng account và đăng ký model Profile trong site administration như sau:

phan5 (16)

Khởi động máy chủ development của bạn bằng cách sử dụng  lệnh python manage.py runserver . Bây giờ, bạn sẽ nhìn thấy model Profile trong site administration của project như hình sau:

phan5 (17)

Bây giờ, chúng ta sẽ cho phép user chỉnh sửa profile của họ trên website. Thêm vào đoạn code sau trong file forms.py của ứng dụng account:

phan5 (18)

Các forms như sau:

  • UserEditForm: sẽ cho phép users chỉnh sửa first name, last name và email của họ được lưu trong model User.
  • ProfileEditForm: sẽ cho phép users chỉnh sửa các dữ liệu thêm mà chúng ta lưu trong model tùy chỉnh Profile. Users có thể chỉnh sửa ngày sinh và upload ảnh trong profile của họ.

Chỉnh sửa file views.py của ứng dụng account và import model Profile như sau:

phan5 (19)

Và thêm vào đoạn code sau trong view register dưới new_user.save():

phan5 (20)

Khi users đăng ký tài khoản trên site, đồng thời chúng ta cũng sẽ tạo một profile rỗng liên quan đến chúng. Bạn sẽ tạo một object Profile bằng tay bằng cách sử dụng site administration cho users mà bạn đã tạo trước đó.

Bây giờ, chúng ta sẽ cho phép users chỉnh sửa profile của họ. Thêm vào đoạn code sau trong cùng file:

phan5 (21)

Chúng ta sử dụng decorator login_required bởi vì users có xác thực mới có thể edit profile của họ. Trong trường hợp này, chúng ta đang sử dụng 2 model forms: UserEditForm để lưu trữ dữ liệu của model tích hợp User và ProfileEditForm để lưu trữ các dữ liệu profile. Để kiểm tra tính hợp lệ của data, chúng ta sử dụng method is_valid() cho cả 2 forms trả về True. Trong trường hợp này, chúng ta lưu cả 2 forms để cập nhật tương ứng với các object trong database.

Thêm URL pattern sau trong file urls.py của ứng dụng account:

phan5 (22)

Cuối cùng, tạo một template cho view này trong templates/account/  và đặt tên là edit.html . Thêm vào đoạn code sau:

phan5 (23)

Chú ý: Chúng ta include enctype=”multipart/form-data” trong form để cho phép upload files. Chúng ta sử dụng chỉ một form HTML để submit cả user_formprofile_form

Đăng ký một user mới và mở địa chỉ http://127.0.0.1:8000/account/edit/ . Bạn sẽ thấy page sau:

phan5 (24)

Bây giờ, bạn cũng có thể chỉnh sửa page dashboard và include liên kết đến chỉnh sửa profile và page thay đổi password. Mở template account/dashboard.html và thay thế dòng:

<p>Welcome to your dashboard.</p>

…với code sau:

phan5 (25)

Users bây giờ có thể truy cập đến form để chỉnh sửa profile của họ từ dashboard.

phan5 (26)

Đọc tiếp: