리우's IT Story
article thumbnail
728x90
반응형

 

우선. 장고를 전반적으로 관리할 수 있는 장고 관리자 계정을 하나만들어준다. 

 


(test) C:\04_pyweb\webpage> python manage.py createsuperuser
Username:  

 

Username: admin
Email address: admin@kgitbank.com

유저네임은 admin으로 할것이고. 

Password:
Password (again):
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: y

비밀번호를 너무 짧게해서 짧은데 괜찮냐고 물어보는 것이다 . y(yes)를 가감하게 입력한다.


Superuser created successfully.

관리자 계정이 성공적으로 생성됐다.

 

(test) C:\04_pyweb\webpage> python manage.py runserver

 

서버를 다시열어주고 .

 

 

주소창 뒤에다 /admin을 입력해주면.

 

이렇게 페이지가 뜨는데 언어를 한글로 바꿔준다.

 

config에 settins.py에서

 

language_code = "ko-kr"

time_zone = 'asia/Seoul' 로 바꿔준다. 

 

 

그리고 웹페이지를 끄고 다시 열어주면. 

이렇게 한글로 바뀐다.

로그인을 해주면 사이트 관리라는 화면으로 넘어온다. 

 

이 슈퍼유저가 굉장히 많은 것을 할 수 있다. 

 

 

board에 admin.py로 가서. 

 

admin.py로 가서 검색기능을 추가해준다. 

 

게시글 목록을 만들어보자. 

 

우선 settings.py에 'DIRS : [BASE_DIR/ 'templates'] 를 확인해준다. 

만약에 dirs를 안건들일꺼다 하면 . 

 

 

templates 밑에 board 폴더를 만들어준다. 

board에 있는 view파일에 index라는 함수에서 http리스폰스  이런 응답을 뿌려주겠다. 

HttpRequest = 요청

HttpResponse = 응답 .

항상 웹페이지의 동작은 서버가 클라이언트한테 request를 요청하고. 

서버는 클라이언트에게 response를 돌려주는게 기본동작이다. 

 

board 에 views.py로 돌아가서

question.object = 퀘스천 모델을 가지고 노는것이다. 

Question.objects.all() 이면 모든것이 다나오는것

 

order by는 정렬. create_date(작성날짜)를 기준으로 정렬을 하겠다는 것이다.  

제일 최신이 맨위로 올라오도록 내림차순정렬을 해주기위해서 -create_date이다 .

 

뒤에서 써먹기위해서 context라는 딕셔너리를 만들어서 question_list를 value로 넣어줬다.

render :  파이썬의 함수를 가공해서   q_list.html파일에다가 돌려주겠다.

 

 

templates에 board - q_list.html파일을 작성해보자. 

 

 

html에도 if문이 존재하고 for문이 존재한다. 
if 조건으로 question_list를 넣어줬다. list가 있으면 참. 

거짓이되면 게시글이 없습니다. 코드가 동작.  

if문을 열었다면 end if로 닫고 for문은 endfor로 닫는다. 

 

"/board/{{ question.id }}/"

객체들을 써먹기위해서 중괄호를 2개쓰는것이다. 

 

게시글이 몇개가 될지 모르기때문에 for문을 돌린다.  question_list안에있는 question내부항목들을 하나하나 만들어준다.

question모델의 고유값이 될 수 있는게 id이다.  링크를 걸어서 question제목을 화면에 출력되게 만들어준것이다. 

 

ex)  ls = [1,2,3,4,5]

       for i in ls:  

 {% for question in question_list %}
        <li><a href="/board/{{ question.id }}/">{{ question.subject}}</a></li>
        {% endfor %}

 

question_list라고 하는 list에 question이라는 변수로 하나하나써먹고있다. 

 

onemore를 누르면  

 

board- urls.py로 가보자

 

Page not found (404)

Request URL:

http://127.0.0.1:8000/board/2/

onemore라는 링크를 열기위해서는 

board/2가 붙어줘야한다. 그래서 숫자를 붙히려고  int형 question_id를 쓰겠다. 이것을 views.detail로 연결시키겠다.

 path('<int:question_id>/', views.detail),

 

다시 views.py로 가서 detail함수를 만들어준다.

 

urls.py에있는 path:경로

    path('<int:question_id>/', views.detail),
def detail(request,question_id):

즉 views에 있는 detail함수에 있는 question_id를 써먹겠다. 

 

def detail(request,question_id):
    question = Question.objects.get(id=question_id)
    context = {'question' : question}
    return render(request, 'board/q_detail.html',context)

question이라는 변수에다가  그 id값을 가지고 get으로 question객체 하나를 뽑아내서 넣어줬다. 

context라는 딕셔너리를 만들어주고 render로써먹었다. 

 

 

그러면 board/q_detail.html이 필요하겠다. 

 

board 폴더에  q_detail.html을 만들어주자. 

 

다시 onemore를 누르면 

 

자 그러면 /board/33/을  다시 띄워보자 

친절하게 존재하지 않는다고 뜬다. 

    raise self.model.DoesNotExist(
board.models.Question.DoesNotExist: Question matching query does not exist.
[15/Apr/2023 16:46:09] "GET /board/33/ HTTP/1.1" 500 72376  클라이언트에도 서버오류라고뜬다. 

 

다시 view.py의 함수 수정. 

from django.shortcuts import render, get_object_or_404

추가로 import하나 시켜준다. 

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

def detail을 수정해주면 

 

 404가 뜨게된다.  500은 servier error이고  404는 client error 클라이언트가 서버에 요청한 자료가 없다. 

 

urls.py로 넘어오는게 /board/

 

 

urlpatterns을 수정해준다. 

 

이 name이라는 이름을 가지고  ''는 index로 연결 시킬 수 있게  수정해준다.

    path('', views.index, name = 'index'),
    path('<int:question_id>/', views.detail),

 

q.list.html로 넘어가보자. 

    <ul>
        {% for question in question_list %}
        <li><a href="{% url 'detail' question.id %}">{{ question.subject}}</a></li>
        {% endfor %}
    </ul>

href 를 수정해준다. 

url detail로 연결시키겠다. detail이라는 이름을 넘겨줄 값을  띄어쓰기로 구분지어서 question_id 값으로 지정해준다. 

    path('<int:question_id>/', views.detail), == <li><a href="{% url 'detail' question.id %}"

 

즉, 주소가 바꼇다고하면 일일이 수정하는 것이 아니라 무조건 detail이라는 이름으로 접근할 수 있도록 만들어놨다. 

 

만약에 게시판이 여러개다 라고하면은  다른 페이지에서도 detail이라는 이름을 써야될 수 있다. 

 

urls.py로 넘어가서 

app_name을 지정해준다. 

 

 <li><a href="{% url 'board:detail' question.id %}"

q_list에 넘어가서 board콜론 detail로 바꿔준다. 

 

 

 

다음은 댓글 기능 구현을 알아보자. 

 

728x90
반응형
profile

리우's IT Story

@LRWoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!