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:
1 2 | django-admin startproject mysite |
- Tạo app
1 2 | 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
1 2 3 4 5 6 7 | 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
:
1 2 3 4 5 6 7 8 9 10 11 | 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") } } |
=>
1 2 | 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
:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>db <span class="token keyword">import</span> models <span class="token keyword">class</span> <span class="token class-name">Question</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> question_text <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">200</span><span class="token punctuation">)</span> pub_date <span class="token operator">=</span> models<span class="token punctuation">.</span>DateTimeField<span class="token punctuation">(</span><span class="token string">'date published'</span><span class="token punctuation">)</span> <span class="token keyword">class</span> <span class="token class-name">Choice</span><span class="token punctuation">(</span>models<span class="token punctuation">.</span>Model<span class="token punctuation">)</span><span class="token punctuation">:</span> question <span class="token operator">=</span> models<span class="token punctuation">.</span>ForeignKey<span class="token punctuation">(</span>Question<span class="token punctuation">,</span> on_delete<span class="token operator">=</span>models<span class="token punctuation">.</span>CASCADE<span class="token punctuation">)</span> choice_text <span class="token operator">=</span> models<span class="token punctuation">.</span>CharField<span class="token punctuation">(</span>max_length<span class="token operator">=</span><span class="token number">200</span><span class="token punctuation">)</span> votes <span class="token operator">=</span> models<span class="token punctuation">.</span>IntegerField<span class="token punctuation">(</span>default<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">)</span> |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> 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__
:
1 2 3 4 5 6 7 8 9 10 11 12 | 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
:
1 2 3 4 5 6 | <span class="token keyword">from</span> django<span class="token punctuation">.</span>contrib <span class="token keyword">import</span> admin <span class="token keyword">from</span> <span class="token punctuation">.</span>models <span class="token keyword">import</span> Question admin<span class="token punctuation">.</span>site<span class="token punctuation">.</span>register<span class="token punctuation">(</span>Question<span class="token punctuation">)</span> |