1. URL과 뷰

C:\projects\mysite> django-admin startapp pybo

터미널에 입력하여 pybo앱을 생성한다.

장고는 config/urls.py 파일에 URL매핑정보를 추가 해야한다.

장고의 urls.py파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일로 URL과 뷰 함수간의 매핑을 정의한다.

장고에서 뷰는 views.py를 의미한다.

urls.py 파일을 아래처럼 수정한다.

from django.contrib import admin
from django.urls import path
#-----edit-----#
from pybo import views
#pybo에 있는 views 모듈을 가져옴
urlpatterns = [
    path('admin/', admin.site.urls),
    #-----edit-----#
    path('pybo/', views.index),
    #장고에는 URL을 정규화 하는 기능이 있기 때문에 pybo가 아닌 pybo/의 형태로 슬래시를 붙여야 함
]

이렇게 해도 views.index가 만들어지지 않아 오류가 뜬다.

views.py에 다음과 같이 index함수를 추가한다.

from django.shortcuts import render
#-----edit-----
from django.http import HttpResponse
def index(request):
    #매개변수 request는 장고 프레임 워크에 의해 자동으로 전달되는 HTTP 요청 객체
    return HttpResponse("안녕하세요")
    #HttpResponse는 HTTP 요청에 대한 응답을 할 때 사용하는 장고 함수
# Create your views here.

장고의 흐름

1. 웹브라우저에서 로컬서버로 URL요청

2. 장고의 urls.py에서 URL을 해석해 views.py 파일의 index 함수를 호출

3. 함수를 실행한 결과를 웹 브라우저에 전달

 

config/urls.py를 다음과 같이 수정

"""config URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/3.0/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
"""
from django.contrib import admin
#-----edit-----#
from django.urls import include, path
urlpatterns = [
    path('admin/', admin.site.urls),
    #-----edit-----#
    path('pybo/', include('pybo.urls')),
    #pybo/로 시작되는 URL이 요청되면 pybo/urls.py 파일의 매핑정보를 읽어서 처리함
    #URL이 추가되더라도 pybo/urls.py 파일만 수정하면 됨
]

pybo/urls.py를 생성 후 다음과 같이 코드 입력

from django.urls import path

from . import views

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

 

2. 모델

 

from django.db import models

# Create your models here.

class Question(models.Model):
    subject = models.CharField(max_length=200)
    #제목
    content = models.TextField()
    #내용
    create_date = models.DateTimeField()
    #작성일시

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    #qustion 모델을 속성으로 가져옴 외래키를 이용해 다른 모델과 연결함
    content = models.TextField()
    #내용
    create_date = models.DateTimeField()
    #작성일시

get은 값의 한건만 리턴함

get은 주로 1건의 데이터 조회시 사용함

filter는 QuerySet으로 나옴

name__contains='찾을 문자'

delete은 데이터를 삭제함

연결모델명_set은 연결된 데이터를 조회함

 

3. 장고 관리자

 

슈퍼유저

-장고 관리자를 사용하기 위 해 슈퍼유저를 생성해야함

-python manage.py createsuperuser를 통해 슈퍼유저 생성

-Password입력시 타이핑이 되지 않는 것처럼 보이지만 입력 되고 있음

 

4. 조회와 템플릿

 

-템플릿 파일(pybo/question_list.html)은 HTML파일과 비슷하지만 장고에서 사용하는 태그들을 사용할 수 있는 HTML파일

-템플릿에 사용되는 태그

분기문 태그 사용법

{% if 조건문1 %}
    <p>조건문1에 해당되는 경우</p>
{% elif 조건문2 %}
    <p>조건문2에 해당되는 경우</p>
{% else %}
    <p>조건문1, 2에 모두 해당되지 않는 경우</p>
{% endif %}

반복문 태그 사용법

{% for item in list %}
    <p>순서: {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}

-for문 안에서는 forloop 객체를 사용할 수 있음

-forloop.counter: 루프내의 순서로 1부터 표시

-forloop.counter(): 루프내의 순서로 0부터 표시

-forloop.first: 루프의 첫번째 순서인 경우 True

-forloop.last: 루프의 마지막 순서인 경우 True

 

객체 출력 태그 사용법

{{ 객체 }}
{{ 객체.속성 }}

5. URL과 네임스페이스

-URL매핑에 name속성을 부여해 주어 링크의 주소대신 별칭으로 사용가능함

-{% url 'detail' question.id %}: 링크를 다음과 같은 형태로 매핑할 수 있음(question.id는 <int:question_id>를 의미함)

-중복을 피하기 위해서 app_name 변수를 지정해야함

-{% url 'pybo:detail' question.id %}의 형태로 네임스페이스를 지정해줄 수 있음

 

6. 데이터 저장

-{% csrf_token %}: 보안에 관련된 항목, 실제 웹페이지에서 작성된 데이터인지를 판단해줌, form태그 아래에 항상 있어야함

-request.POST.get('content'): POST로 전송된 폼 데이터 항목 중 content의 값을 의미함

-redirect 함수는 페이지 이동을 위해 장고가 제공하는 함수

 

7. 스태틱

-스타일시트 파일은 장고의 스태틱 디렉터리에 저장해야함

-스태틱 파일을 적용하기 위해 아래와 같은 태그를 html파일에 넣어야 함

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">

 

8. 템플릿상속

-{% block content %}  {% endblock %}는 base.html을 상속한 템플릿에서 구현해야하는 영역

 

9. 폼

-장고의 폼은 일반폼과 모델폼으로 나누어짐

-모델폼은 모델과 연결된 폼으로 폼을 저장하면 연결된 모델의 데이터를 저장할 수 있게 됨

-모델폼은 class Meta라는 내부 클래스가 반드시 필요함

-Meta 클래스에는 사용할 모델과 모델의 속성을 적어줘야 함

-{{ form.as_p }}: 제목과 내용같은 폼 입력 항목을 위한 html코드들을 자동으로 만들어냄

-{{ form.subject.value|default_if_none:'' }}: 오류가 발생시 기존 입력 값을 유지해 줌

- |default_if_none:''는 폼데이터에 값이 없을 경우 None대신 공백으로 표시하기 위한 필터

+ Recent posts