Django 프레임워크 시작

31075 단어 Django
3대 주류 프레임워크 (1) Django(2) Flask(3) Tornado
Django MVC 모드(1) 모델 모델(2) 뷰 View(3) 컨트롤러 Controller
준비 작업
1. 프로젝트 만들기
django-admin startproject <projectName>

# eg:
django-admin startproject mysite
cd mysite

2. 프로젝트 소개
setting.py  #     
urls.py     #     
manage.py   #     

3. Django 기본 명령
python manage.py runserver #   Django  
python manage.py shell     # shell  
python manage.py test      #     

4. 데이터베이스 관련 명령
python manage.py makemigrations  #            
python manage.py migrate         #               
python manage.py dumpdata        #         
python manage.py loaddata        #         

5. Django 프로젝트 Vs Django 응용 프로그램 각 응용 프로그램은 자신의 모델 보기 템플릿 루트와 정적 파일을 관리할 수 있다. 한 항목은 하나의 설정과 몇 개의 Django 응용 프로그램을 포함할 수 있다.
6. 응용 프로그램 만들기(1) 새 응용 프로그램 만들기
python manage.py startapp <appName>

# eg:
python manage.py startapp myblog

(2)setting.py에서 app 등록
INSTALLED_APPS = [
    # ...

    'myblog.apps.MyblogConfig'  #      app
]

(3) 새 보기 함수 myblog/views.py
from django.http import HttpResponse


def hello(request):
    return HttpResponse("hello Django")


(4) app에서 URL을 설정하여 myblog/urls를 새로 만듭니다.py URL과 보기 매핑 관계

from django.urls import path
from . import views


urlpatterns = [
    path('hello', views.hello),
]


(5) 항목에 url urls를 설정합니다.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myblog/', include("myblog.urls")),
]

액세스 테스트http://127.0.0.1:8000/myblog/hello
7. 응용 디렉터리
views.py   #     
models.py  #     
admin.py   # Admin      
apps.py    #     
tests.py   #         
urls.py    #       (    )

Django 모델 레이어
뷰 레이어 모델 레이어 데이터베이스
1. 모델층(1) 서로 다른 데이터베이스 간의 차이를 차단한다(2) 편리한 작업 증거
2、settings.py 설정 데이터베이스 엔진
DATABASES  #            sqlite3

3. 모델 필드 유형(1) 숫자 유형: IntegerField(2) 텍스트 유형: TextField(3) 날짜 유형: DataTimeField(4) 자체 증가 ID: AutoField(5) 메인 키:primarykey
myblog/models.py 새 글 모델
from django.db import models


class Article(models.Model):
    #      ID
    article_id = models.AutoField(primary_key=True)
    #     
    title = models.TextField()
    #     
    brief_content = models.TextField()
    #     
    content = models.TextField()
    #       
    publish_date = models.DateTimeField(auto_now=True)


데이터베이스 테이블 작성 작업 수행
$ python manage.py makemigrations  #       

$ python manage.py migrate         #     


4. Django Shell 인터랙티브 프로그래밍 소범위 테스트
셸에 들어가기
python manage.py shell

from myblog.models import Article

#     
a = Article()
a.title = "    "
a.brief_content = "    "
a.content = "    "

print(a)

a.save()

#     
articles = Article.objects.all()
article = articles[0]
print(article.title)


5. Django Admin 백그라운드 관리 도구 사용자 인증, 관리 테이블 표시, 입력 확인 등 비슷한 기능
관리자 만들기
python manage.py createsuperuser

백그라운드 관리 주소http://127.0.0.1:8000/admin
모형을 관리자 모듈 myblog/admin에 등록합니다.py
from django.contrib import admin

# Register your models here.
from .models import Article

admin.site.register(Article)


백그라운드 표시 myblog/models를 수정합니다.py
class Article(models.Model):
    # ...

    #   admin     Article object -> self.title
    def __str__(self):
        return self.title



6. 데이터 반환
보기 함수 myblog/views를 작성합니다.py

from django.http import HttpResponse, JsonResponse
from .models import Article

def articles(request):
    #      select * from article
    lst = Article.objects.values().all()
    return JsonResponse(list(lst), safe=False)


app 루트 설정 myblog/urls.py
from django.urls import path
from . import views


urlpatterns = [
    path('hello', views.hello),
    #       
    path('articles', views.articles),
]

테스트 반환http://127.0.0.1:8000/myblog/articles
[
    {
        "article_id": 1,
        "title": "    ",
        "brief_content": "    ",
        "content": "    ",
        "publish_date": "2019-09-14T14:36:32.400Z"
    },
    {
        "article_id": 2,
        "title": "        ",
        "brief_content": "             ",
        "content": "           ",
        "publish_date": "2019-09-14T14:36:51.387Z"
    }
]

Django 뷰 및 템플릿
Bootstrap 그리드 시스템, 너비 12등분https://www.bootcss.com/
1. 템플릿 시스템의 표현 형식은 텍스트가 분리된 문서의 표현 형식과 표현 내용이 특유의 라벨 자리 차지 문자를 정의한 것이다.
2. 기본 문법(1) 변수
{{name}}

(2) for 루프
{% for item in list %} 
    
  • {{item}}
  • {% endfor %}

    (3) if-else 분기
    {% if true %} 
        

    true

    {% else %}

    false

    {% endif %}

    3. 렌더링 페이지 myblog/views.py
    from django.shortcuts import render
    from .models import Article
    
    def index_page(request):
        lst = Article.objects.all()
    
        data = {
            "article_list": lst
        }
        return render(request, "myblog/index.html", data)
    
    

    myblog/templates/myblog/index.html
    {% for article in article_list %}
        <div class="page-body-main">
            <h2>{{ article.title }}h2>
            <p>{{ article.content }}p>
        div>
    
    {% endfor %}
    

    4. 라우팅 매개변수
    myblog/urls.py
    from django.urls import path
    from . import views
    
    #       
    app_name = "myblog"
    
    urlpatterns = [
        #...
    
        path('detail/', views.detail_page, name="detail"),
    ]
    
    

    전달 루트 매개 변수 myblog/templates/myblog/index.html
    
    {{ article.title }}{{ article.title }}

    5, 조회 SQL 로그 setting.py
    #   sql  
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level': 'DEBUG',
            },
        }
    }
    

    6, Paginator 페이지
    보기 함수 myblog/views.py
    
    def index_page(request):
        page = request.GET.get("page", "1")
        page = int(page)
    
        #            
        lst = Article.objects.all()
        
        #   ,  5 
        paginator = Paginator(lst, 5)
        current_article_list = paginator.get_page(page)
    
        #       
        if current_article_list.has_next():
            next_page = current_article_list.next_page_number()
        else:
            next_page = page
    
        if current_article_list.has_previous():
            previous_page = current_article_list.previous_page_number()
        else:
            previous_page = page
    
        data = {
            "article_list": current_article_list,
            "page_range": paginator.page_range,
            "current_page": page,
            "previous_page": previous_page,
            "next_page": next_page,
    
        }
        return render(request, "myblog/index.html", data)
    
    

    템플릿 렌더링 페이지 섹션 (Bootstrap 스타일 사용) myblog/templates/myblog/index.html
     <ul class="pagination">
        <li>
            <a href="{% url 'myblog:index' %}?page={{ previous_page }}" aria-label="Previous">
                <span aria-hidden="true">«span>
            a>
        li>
    
        {% for page in page_range %}
            <li><a href="{% url 'myblog:index' %}?page={{ page }}">{{ page }}a>li>
        {% endfor %}
    
        <li>
            <a href="{% url 'myblog:index' %}?page={{ next_page }}" aria-label="Next">
                <span aria-hidden="true">»span>
            a>
        li>
    ul>
    

    좋은 웹페이지 즐겨찾기