Hướng dẫn tạo app django - P2
Bài đăng này đã không được cập nhật trong 5 năm
Phần 2 - Tạo project, tạo app, tạo model, migration, trang admin
- Note lại từ tài liệu học django 3.0 https://docs.djangoproject.com/en/3.0
- Cài đặt python: https://docs.djangoproject.com/en/3.0/intro/tutorial01/
- Tạo project mới:
django-admin startproject mysite
- Tạo app
python manage.py startapp polls
- Tạo views trong app
- Tạo url trong app
- đặt url của app vào project
Database setup mysite/settings.py:
1 trong 4 loại ENGINE:
- 'django.db.backends.sqlite3'
- 'django.db.backends.postgresql' (package
py-postgresql), 'django.db.backends.postgresql_psycopg2' (packagepsycopg2) ... - 'django.db.backends.mysql'
- 'django.db.backends.oracle' Demo config mặc định
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
Cần dùng thêm biên môi trường, demo với package python-dotenv:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': os.getenv("DB_NAME"),
'USER': os.getenv("DB_USERNAME"),
'PASSWORD': os.getenv("DB_PASSWORD"),
'HOST': os.getenv("DB_HOST"),
'PORT': os.getenv("DB_PORT")
}
}
=>
python manage.py migrate
Creating models
Cơ bản django support tạo file migration database dựa trên khai báo model => ngon hơn laravel, rails 
Demo polls/models.py:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Activating models
Tại mysite/settings.py: thêm vào INSTALLED_APPS cấu hình polls 'polls.apps.PollsConfig'
CMD: python manage.py makemigrations polls => tạo file migration tự động từ các models (Question, Choice)
Kiểm tra migration sql khi chạy: python manage.py sqlmigrate polls 0001 => chạy file 0001 tạo các table trong database.
Migrate database: python manage.py migrate
Sử dụng API shell
Mở trình tương tác django shell: python manage.py shell
Tạo dữ liệu bằng cơm:
>>> from polls.models import *
>>> Question.objects.all()
<QuerySet []>
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2020, 4, 21, 8, 13, 23, 509304, tzinfo=<UTC>)
>>> q.question_text = "What's up?"
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
>>>
vì <QuerySet [<Question: Question object (1)>]> không thuận tiện cho dev nến rất cần sử dụng __str__ :
from django.db import models
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
Tham khảo sử dụng datetime và timezone, các command thêm, sửa, xóa, query, filter với django shell: https://docs.djangoproject.com/en/3.0/intro/tutorial02/
Introducing the Django Admin
Để ý các bảng được migrate ngay từu đầu, Django Admin là 1 cơ chế hỗ trợ rất mạnh cho việc quản lý CRUD cơ bản khi không đòi hỏi spec mới mẻ gì. Django hoàn toàn tự động tạo giao diện quản trị cho các models. Quản lý web site sử dụng trang web để thêm tin tức, sự kiện thể thao ... Django giải quyết vấn đề tạo giao diện hợp nhất cho quản trị viên trang để chỉnh sửa nội dung. Quản trị viên không định để tran web đc sử dụng bởi khách truy cập trang web, mà cho người quản trị trang web.
Creating an admin user
tạo mới người quản trị : python manage.py createsuperuser
Khởi động server => python manage.py runserver vào trang admin đăng nhập là đc, tuy nhiên chưa thể quản lý app polls
Làm cho app polls có thể được chỉnh sửa bởi trang admin
polls/admin.py:
from django.contrib import admin
from .models import Question
admin.site.register(Question)
All rights reserved