# First Django App Target: create a basic poll application, with 2 parts a **public site** and a **admin site** * **public site**: let's pp view polls and vote * **admin site**: let's you(admin) add/change/delete poll ## Part 1 1. Create web project 2. Create 1st app 3. Create 1st view 4. Add view & app into web url ### Creating a project In the source directory, create project by ``` $ django-admin startproject ``` Constraint on ``: * don't use names that conflict with django * e.g. `django`, `test` (test with built-in test file) ``` mysite/ manage.py mysite/ __init__.py settings.py urls.py asgi.py wsgi.py ``` Explain file structure: * top-level `mysite/`: container of the project, can be renamed latter w/o affect Django framework * `manage.py`: cmd-line utility let us to interact (admin) with Django projects. * inner `mysite/` dir: actual Python package for the project. * Importing any package from here: e.g. `mysite.urls` * `mysite/__init__.py`: empty file, tell python start from here. * `mysite/settings.py`: settings/config for this django project. * `mysite/urls.py`: URL declarations for this Django pjt; a "table of contents" of this Django website. * `mysite/asgi.py`: An entry-point for ASGI-compatible webservers * `mysite/wsgi.py`: Entry-point for WSGI-compatible webservers ### The development server Start server steps: 1. cd into outer `mysite/` dir 2. Start server via: `python manage.py runserver` Outcome: * A development server is started. So no need to config a production server (e.g. Apache) * Note: don't use it as production environment. ### Creating the Polls app > Projects vs. apps > > What’s the difference between a project and an app? An app is a Web application that does something – e.g., a Weblog system, a database of public records or a small poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects. Create a poll app along `mysite/`. For what? ``` $ python manage.py startapp polls ``` app hierarchy ``` polls/ __init__.py admin.py apps.py migrations/ __init__.py models.py tests.py views.py ``` ### Write the first view #### Step 1: Create a simple view of `polls` app modify `polls/views.py` as ```python from django.http import request from django.shortcuts import render def index(request): return HttpResponse("Hello, world. You're at the polls index") ``` * `def index(request):...` is the simplest view #### Step 2: In `polls` app, map the URL to this view After creating a view, map it to a URL so we can call it. Create `polls/urls.py`, and setup mapping `urlpatterns` ```python from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ] ``` #### Step 3: Point the root URLconf for polls To point the root URLconf at `polls.urls` module: 1. In `mysite/urls.py` 1. add import for `django.urls.inclue` 2. insert a `include()` in `urlpatterns` list i.e. ```python from django.contrib import admin from django.urls import include, path urlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls), ] ``` ##### django.urls.include() > django.urls.include(): A function that takes a full Python import path to another URLconf module that should be “included” in this place. * new imported `include()` function allows referencing other URLconfs. * `'polls.urls'` is the package that we are using, hence `mysite` can connect to `polls` app ##### path() Here `path()` function is passed **route** and **view**; two additional option available **kwargs**, and **name** * `path()` argument **route**: a string that contains a URL pattern. When Django processing a request, it starts at the first pattern in `urlpatterns` and go down the list, comparing requested URL against each pattern * `path()` argument **view**: when Django finds a matching pattern, it calls specified view function (a `HttpRequest` obj as the 1st argument, and others captured values as keyword argument) * `path()` argument **kwargs**: passed in a dictionary to the target view * `path()` argument **name**: naming URL, so we can refer to it elsewhere. ## Part 2 ### Database setup 1. Modify `mysite/settings.py` for database binding 2. `python manage.py migrate` create database for each app ### Models Creation 在 Django 里写一个数据库驱动的 Web 应用的第一步: **定义模型** - 也就是数据库结构设计和附加的其它元数据 Meta Data ### Activate Models 改变模型需要这三步: * 编辑 models.py 文件,改变模型 * 运行 python manage.py makemigrations 为模型的改变生成迁移文件。 * 运行 python manage.py migrate 来应用数据库迁移。 在这之前,确认polls已经在 INSTALLED_APPS的settings中。 详情如何使用 `manage.py` 可check [Django后台文档](https://docs.djangoproject.com/zh-hans/3.1/ref/django-admin/) ### Test API 进入 `python manage.py shell` 可以使用Django创建的各种API,如[数据库抽象API database API(建议细看)](https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/)