+1

Hướng dẫn tạo app django - P2

Phần 2 - Tạo project, tạo app, tạo model, migration, trang admin


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' (package psycopg2) ...
  • '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)>]>
>>> 

<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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí