728x90
반응형

이 포스팅은 html을 화면에 띄우기 까지 자세한 동작 과정을 설명하기 위해 작성되었다.

 

settings에 대한 건 지난 포스팅에 했던 파일에 이어서 했기 때문에 참고하면 좋을 것 같다.

 

 

2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기

 

[Django] 파이참 설치하고 장고 개발 서버 실행하기

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅 [Django] cmd로 가상환경 만들기 / 기본환경셋팅 cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다..

hello-ming.tistory.com


터미널에 아래의 코드를 치면 hello_world라는 app이 만들어 진다.

 

python manage.py startapp hello_world

 

 

파일이 생성됨을 확인할 수 있다.

 

 

apps에 들어가면 HelloWorldConfig 클래스가 자동 생성됨을 확인할 수 있는데 

 

,

 

mysite - settiings에 자동으로 등록이 안되므로 아래 사진처럼 직접 추가해 준다.

 

 

이전 포스팅에 생성한 mysite(프로젝트) - urls.py에 path를 이용하여 hello_world를 추가한다.

 

hello_world로 들어오면 include로 hello_world앱에 밑에있는 urls.py를 찾는다는 뜻이다.

 

위 말대로 urls.py에 이동하기 위해 hello_world 파일안에 urls.py를 만들어준다.

 

hello_world/urls.py

from django.urls import path

from hello_world import views

app_name = 'hello_world'
urlpatterns=[
    path('',views.hello_world, name='hello_world'), #views안의 hello_world파일과 연결

]

views 밑에 hello_word 함수로 들어온다는 뜻이다.

 

view 파일에 hello_world 함수를 만든다.

 

hello_world/views.py

from django.shortcuts import render

# Create your views here.
def hello_world(request):
    return render(request,'hello_world/hello_world.html',{})

request가 들어오면 hello_world폴더 안에 hello_word.html을 반환한다.

 

 

hello_world.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
안녕하세요?
</body>
</html>

 

서버를 돌린다.

 

브라우저가 뜨자마자 이 화면이 뜨는데 /hello_world/를 붙여주면 된다!

 

 

hello_world.html의 화면과 동일하게 나왔다.

 

728x90
반응형
728x90
반응형

2021.06.09 - [BACK-END/Django] - [Django] (투표하기)-모델 만들기 / makemigrations / migrate

 

[Django] (투표하기)-모델 만들기 / makemigrations / migrate

2021.06.08 - [BACK-END/Django] - [Django] admin 커스터마이징 / MySQL 연동 [Django] admin 커스터마이징 / MySQL 연동 2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기 [..

hello-ming.tistory.com

 

전 포스팅에서 Questions와 Choices 모델을 만들었다. 지난 포스팅에 이어 계속해서 Django 공식 튜토리얼을 토대로 참고 자료로 내용을 덧붙여 포스팅하도록 하겠다.


이번에 추가할 뷰는 총 네 가지이다.

 

1. index : 최근의 질문들을 표시한다.

 

2.  detail : 질문 내용과 투표할 수 있는 서식을 표시한다.

 

3.  results : 특정 질문에 대한 결과를 표시한다.

 

4.  vote : 질문에 대해 선택을 할 수 있는 투표 기능을 제공한다.

 

from django.http import HttpResponseRedirect
from django.shortcuts import render, get_object_or_404

# Create your views here.
from django.urls import reverse

from polls.models import Question, Choice


# 함수 형 view , 클래스형 view
def index(request):
    latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

def detail(request, question_id):
    question = get_object_or_404(Question,pk=question_id)
    return render(request,'polls/detail.html',{'question':question})

def results(request, question_id):
    question = get_object_or_404(Question,pk=question_id)
    return  render(request, 'polls/results.html',{'question':question})
def vote(request, question_id):
    question =get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except(KeyError ,Choice.DoesNotExist):
        #질문 투표 형식을 다시 표시함
        return render(request, 'polls/detail.html',{
            'question':question,
            'error_message':'당신은 선택한 항목이 없습니다.'
        })
    else :
        selected_choice.votes +=1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results',args=(question.id,)))

 

[코드 설명]

 

index

새로운 index() 뷰 하나를 호출했을 때, 시스템에 저장된 최소한 5개의 투표 질문이 콤마로 분리되어, 발행일에 따라 출력된다.

polls/index.html 템플릿을 불러 온 후, context를 전달한다. context는 템플릿에서 쓰이는 변수명과 Python 객체를 연결하는 사전형 값이다. 


vote

Post 데이터를 성공적으로 처리가 된 후 HttpResponseRedirect를 반환한다.

이것은 사용자가 back 버튼을 누르면 두 번 글이 등록되는 것을 방지하기 위해서 이다.

reverse는 url을 해당 url을 찾을 때 사용함 기본적으로 url을 가지고 이동하는데 반대로 url을 찾아야 하므로 거꾸로라는 reverse를 호출한다.


 

URLconf를 통해 URL 패턴을 뷰에 연결하는 작업이 필요하므로 path() 함수를 이용해 호출을 추가하여 작성한 새로운 뷰를 polls.urls 모듈에 연결한다.

 

polls/urls.py를 생성해서 내용을 추가한다.

from django.urls import path

from polls import views

app_name = 'polls'
urlpatterns=[
    path('',views.index, name='index'), #views안의 index파일과 연결
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote', views.vote, name='vote'),
]

 

runserver를 돌려 /admin으로 접속한다.

Choices와 Questions에 각각 +add 를 눌러 항목을 만든다.

 

 

그리고 또한 MySQL에서 Question을 생성할 수 있다.

 

 


디자인을 위해 templates를 작성할 것이다.

 

polls - templates - polls 디렉토리를 생성한 후 detail.html,  index.html, results.html을 생성한다.

 

index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>가능한 여론(polls)가 없어요</p>
{% endif %}

 웹 브라우저에 "/polls/"페이지를 불러오면 이전에 작성한 질문이 포함된 질문 리스트가 표시된다. 각 질문 링크는 해당 질문에 대한 세부 페이지를 가리키고 있다.

 

detail.html

<h1> {{ question.question_text}}</h1>
{% if error_message  %}<p> <strong> {{error_message}} </strong></p> {% endif %}

<form action ="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}"/>
        <label for="choice{{ forloop.counter }}"> {{ choice.choice_text }}</label> <br/>
    {% endfor %}
    <input type="submit" value="Vote"/>
</form>

■ 각 질문 선택 항목를 라디오 버튼으로 표시한다. 각 라디오 버튼의 value는 연관된 질문 선택 항목의 ID이다. 각 라디오 버튼의 name은 "choice"이므로 누군가가 라디오 버튼 중 하나를 선택해 폼을 제출하면, POST 데이터인 choice=#을 보낼 것이다. 여기서 #은 선택한 항목의 ID이다.

 

■ 폼의 action을 {%url 'polls:vote' question.id%}로 설정하고 method="post"를 설정한다(metho="get"이 아니라). method="post"를 사용한다는 점이 굉장히 중요하다. 그 이유는 폼의 송신은 서버쪽의 데이터의 갱신으로 연결되기 때문이다. 서버쪽의 데이터를 갱신하는 폼을 작성할 경우는 method="post"을사용하자. 이것은 장고 고유의 특징이 아닌 웹 개발에 전체에 통용되는 것이다.

 

■ forloop.counter은 for태그의 루프가 몇 번 실행되었는지 표시하는 값이다.

 

■ (데이터가 변조될 위험이 있는) POST 폼을 작성하고 있으므로, Cross Site Request Forgeries에 대해 신경써야할 필요가 있다. 다행히도, 장고가 이에 대해 대응하기 위해 사용하기 쉬운 구성품을 제공하고 있으므로 그렇게 걱정할 필요는 없다. 짧게 말하자면, 내부 URL 대상의 모든 POST 폼은 {% csrf_tokem %} 템플릿 태그를 써야한다. 

 

results.html

<h1>{{ question.question_text}}</h1>
<ul>
    {% for choice in question.choice_set.all %}
        <li> {{ choice.choice_text }} -- {{ choice.votes }} vote {{ choice.votes | pluralize }} </li>
    {% endfor %}
</ul>

<a href="{% url 'polls:detail' question.id %}">다시 투표하실래요?</a>

 

웹 브라우저의 /polls/1/ 페이지에서 투표를 할 수 있을 것이고 투표할 때마다 값이 반영된 결과 페이지를 확인할 수 있다.

 

만약 투표를 하지 않았다면 오류 메시지를 확인할 수 있을 것이다. 

[ 동작 화면 ]

 

728x90
반응형
728x90
반응형

 

 지난 포스팅을 통해 앱 만들기의 기본 세팅을 완료했다. 지난 포스팅에 이어 계속해서 Django 공식 튜토리얼을 토대로 참고 자료로 내용을 덧붙여 포스팅하도록 하겠다.


2021.06.08 - [BACK-END/Django] - [Django] admin 커스터마이징 / MySQL 연동

 

[Django] admin 커스터마이징 / MySQL 연동

2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기 [Django] 파이참 설치하고 장고 개발 서버 실행하기 2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 /..

hello-ming.tistory.com

이 포스팅 이후의 작업이다.

 

django를 이용해서 웹 사이트에서 투표하는 것을 만들 것이라

 

model은 2가지가 필요하다. Question과 Choice

 

Question은 질문이고 Choice는 선택해서 투표가 몇 번 되었는지 확인할 수 있게 진행할 것이다.

 

models.py

from django.db import models


# Create your models here. 모델만들기
class Question(models.Model):
    question_text = models.CharField(max_length=200) #데이터 타입 문자열
    pub_date = models.DateTimeField('date published') #데이터 타입 날짜

    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) # 칼럼은 외래키로 Question과 연결됨
    choice_text = models.CharField(max_length=200) #문자열
    votes = models.IntegerField(default=0) #정수

    def __str__(self):
        return self.choice_text

    # 테이블 두개 만드는 것 부모테이블 자식테이블

 

이제 터미널에서 migrations와 migrate를 해주면 된다.

 

 

migrations

 

모델 변경 내역 히스토리 관리

 

- 모델의 변경내역을 DB Schema(데이터베이스 데이터 구조)로 반영시킨다.

 

터미널에서 아래의 코드를 적용시킨다.

python manage.py makemigrations 

 

만약 오류가 뜬다면 아래의 포스팅에 해결방법을 써놔서 참고하면 된다.

 

2021.06.10 - [Tip] - [Django] python manage.py makemigrations 에러 no changes detected

 

[Django] python manage.py makemigrations 에러 no changes detected

python manage.py makemigrations 하는데 오류가 떴다... no changes detected 에러 발생 이유는 연동된 database에서 변경된 부분이 없을 때 발생한다고 한다... 해결방법은 setting.py의 INSTALLED_APPS에 추가..

hello-ming.tistory.com

 

migrations 적용 후 migrate는 아래의 코드를 터미널에 적용하면 된다.

 

python manage.py migrate

 

정리를 해보면

1. 마이그레이션 파일(초안) 생성하기 : makemigrations

 

2. 해당 마이그레이션 파일을 DB에 반영하기 : migrate

 

터미널에서 코드를 다 적용시킨 후 polls - migrations 폴더를 확인해 보면. py 형식의 파일이 새로 생겼음을 알 수 있다.

 

 

터미널에 runserver을 돌려 url에 들어가 /admin을 해주면

 

python manage.py runserver

 

polls 앱에 Choices와 Questions 모델이 생성됨을 확인할 수 있다.

 

다음 포스팅은 기능을 추가하여 직접 투표할 수 있도록 해보겠다!

728x90
반응형
728x90
반응형

2021.06.07 - [BACK-END/Django] - [Django] 파이참 설치하고 장고 개발 서버 실행하기

 

[Django] 파이참 설치하고 장고 개발 서버 실행하기

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅 [Django] cmd로 가상환경 만들기 / 기본환경셋팅 cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다..

hello-ming.tistory.com

 

이 포스팅 이후의 작업이다!

 

mysql연동을 위해  mysqlclient 를 설치해야한다.

 

[settings] - [python Interpreter]

 

mysite에 settings.py가 생긴걸 볼 수 있다.

localhost, databases 등록한다., time_zone도 바꿔야한다!

 

 

mysql 연결하기 위해 mysql workbench

django 데이터베이스 추가한다.

 

mysql에 만들어 주었다.

본인이 설정한 mysql의 정보를 입력한다.

파일을 저장한 뒤 terminal에 아래의 코드 추가한다.  관리자 권환 주는것이다!

 

데이터베이스를 적용해라? 정도의 뜻이다.

 

manage.py 가 있는 경로로 찾아가 코드를 입력한다.

실행이 다 도면

 

뭔가 알아서 테이블들을 만들어 준다.

 

manage.py가 있는 경로에서 runserver를 입력한다.

 

url이 뜨는데 ctrl을 누른채 클릭하면 새창으로 django창이 뜬다.

 


admin 계정으로 접근할 거 만들기

 

아까 로켓화면의 url창에 사진처럼 /admin을 붙여준다.

 

 

관리자 로그인 하라는 창으로 전환이된다.

 

 

어드민 계정을 만들어 주기 위해 createsuperuser을 해준다.

 

manage.py가 있는 경로에서 입력해야한다.

 

username과 email, password는 직접 정하는 것이다!

 

비밀번호 항목은 가려져있다! 입력하고 enter를 누르면 여러 창이 뜨는데 y를 쳐서 enter하면된다.

 

 

세팅을 마쳤으니 이제 /admin으로 가서 로그인을 해보자.

 

 

 

로그인을 하면 이러한 화면이 뜨는데 users를 생성해 보자

 

 

 

user의 이름과 비밀번호를 설정하고 save를 눌러주면 비밀번호가 너무 짧아서 다시 작성해야한다...

 

 

비밀번호를 한층 더 어렵게 설정했다.  @hong1234

 

 

사진속처럼 이메일을 설정하면 유효하지 않다고한다. @naver.com까지 하면 된다.

 

save 해준다.

 

 

생성되었다!

 

다시 /admin으로 가면 생성됨을 확인할 수 있다.

 

 

728x90
반응형
728x90
반응형

2021.06.07 - [BACK-END/Django] - [Django] cmd로 가상환경 만들기 / 기본환경셋팅

 

[Django] cmd로 가상환경 만들기 / 기본환경셋팅

cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다! django를 설치할 파일을 미리 만들어 주었다. 로컬 디스크 c에 python3이라는 폴더를 만들어 주었다. cmd창에 들어간다. c

hello-ming.tistory.com

 

위의 포스팅 이후에 작성한 글이므로 전 포스팅의 기본환경셋팅과 연결된다!

 

나는 그동안 PyCharm Edu로 써왔어서 이번에 다시 설치하게 되었다.

 

파이참(PyCharm)  Community 버전으로 설치한다.

https://www.jetbrains.com/pycharm/download/#section=windows 

 

 

파이참을 실행해서 프로젝트를 새로 만든다.

 

 

Virtualen을 이용해서 C:\python3\venv 폴더에 파이썬 3.6의 가상환경을 생성하겠다는 뜻이다.

 

가상환경 생성중

 

CLI 환경을 파이참에서 설치할 것이다.

 

settings - Project Interpreter 에 들어간다.

 

 

+ 버튼을 눌러준다.

 

 

전 포스팅에서 cmd로 Django를 설치했는데 그 패키지 안의 python.exe와 연결해준다.

 

Django와 연결됨을 확인할 수 있다.

 

파이참 내의 terminal을 연다.

 

 

이런식으로 (django)로 시작하면 성공된 것이다.

 

mysite 라는 django 프로젝트 이름을 생성할 것이다. 

 

중요한 것은 [ mysite . ]  여기에 . 이 없으면 mysite 안에 또 만들어서 꼭 . 를 붙여줘야 한다.

 

어플리케이션은 생성되었고 polls를 생성해보자

 

polls는 여론조사 같은것이다.  실행하면 polls라는 앱이 생성된다.

 

mysite는 프로젝트 이름이고 polls는 어플리케이션이다.

 

 

runserver는 브라우저를 돌리는 것이다.

 

 

위 사이트를 CTRL을 누른채로 클릭하면 새창에 뜨는데 밑에 그림이 뜬다면 연결된것이다.

 

 

django를 시작할 준비가 되었다는 뜻이다.

728x90
반응형
728x90
반응형

 

cmd를 이용하여 Django에 필요한 가상환경을 만들것이다. 파이썬이 있어야한다!

 

django를 설치할 파일을 미리 만들어 주었다. 로컬 디스크 c에 python3이라는 폴더를 만들어 주었다.

 

cmd창에 들어간다.

 

cd를 이용하여 django를 설치할 파일로 이동한다.

 

python -m venv django

 

그 후 cd로 django 파일로 이동한 뒤 dir을 이용하여 설치되었는지 확인한다.

 

 

Scrips\activate

 

django를 설치한다.

 

pip install django

 

 

하면 만들어진 가상환경에 django가 설치가 된다.

 

728x90
반응형

+ Recent posts