Part 2 – Create project, create app, create model, migration, admin page
- Note from django 3.0 learning material https://docs.djangoproject.com/en/3.0
- Install python: https://docs.djangoproject.com/en/3.0/intro/tutorial01/
- Create a new project:
1 2 | django-admin startproject mysite |
- Create the app
1 2 | python manage.py startapp polls |
- Create views in the app
- Create url in app
- Put the url of the app into the project
Database setup mysite/settings.py
:
1 of 4 types of ENGINE:
- ‘django.db.backends.sqlite3’
- ‘django.db.backends.postgresql’ (
py-postgresql
package), ‘django.db.backends.postgresql_psycopg2’ (packagepsycopg2
) … - ‘django.db.backends.mysql’
- ‘django.db.backends.oracle’ Demo default config
1 2 3 4 5 6 7 | DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } |
Need to use additional environment borders, demo with python-dotenv
package:
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
Basically django support creates migration database file based on model declaration => is better than 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
At mysite/settings.py
: add INSTALLED_APPS
polls configuration 'polls.apps.PollsConfig'
CMD: python manage.py makemigrations polls
=> create automatic migration file from models (Question, Choice)
Check migration sql at runtime: python manage.py sqlmigrate polls 0001
=> run file 0001 to create tables in the database.
Migrate database: python manage.py migrate
Using API shell
Open django shell interactive: python manage.py shell
Create data with rice:
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)>]> >>> |
Because <QuerySet [<Question: Question object (1)>]>
not convenient for __str__
is necessary to use __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 |
Refer to the use of datetime and timezone, the commands to add, edit, delete, query, filter with django shell: https://docs.djangoproject.com/en/3.0/intro/tutorial02/
Introducing the Django Admin
Looking at migrated tables from the outset, Django Admin is a very powerful support mechanism for basic CRUD management when no new spec is required. Django automatically creates an administration interface for models. Site management uses the site to add news, sporting events … Django solves the problem of creating a unified interface for site administrators to edit content. The administrator is not intended to be used by site visitors, but to webmasters.
Creating an admin user
create new administrator: python manage.py createsuperuser
Start server => python manage.py runserver
to admin login page, but can’t manage app polls
Making app polls editable by admin page
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> |