[부트스트랩]

 

부트스트랩은 디자이너의 도움 없이 개발자 혼자서 괜찮은 수준의 웹 페이지를 만들수 있게 도와주는 프레임워크이다. 

https://getbootstrap.com/docs/5.1/getting-started/download/

 

Download

Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.

getbootstrap.com

링크를 통해 다운로드하자. 버전은 5.x 버전이다. 

다운로드하면 다음과 같은 폴더가 있다.

그안에 

css 폴더안에 

bootstrap.min.css 파일이 있다. 이 다운받은 폴더\css\bootstarp.min.css 파일을

\Users\<사용자명>\ptojects\mysite\static\bootstrap.min.css 위치로 복사해 준다.

정확한 위치로 잘 복사하자.

 

projects\mysite\templates\pybo\question_list.html 파일을 다음과 같이 수정하자.

부트스트랩 스타일을 적용했으니 템플릿도 부트스트랩을 사용하도록 하자.

projects\mysite\templates\pybo\question_list.html 를 다음과 같이 수정하자.

 

바로 전에 작성한것 밑에다가 적어주면 된다. 원래는 <ul> 태그로 간단하게 작성했던 질문 목록을 테이블 구조로 변경했다. 번호와 작성일시 항목도 추가했다. 번호는 for 문의 현재 순서를 의미하는 {{ forloop.counter }} 를 이용했다. 여기서 사용한 class="container my-3", class="table", class="table-dark" 등은 부트스트랩 스타일에 정의되어 있는 클래스들이다. 부트스트랩에 대한 자세한 내용은 다음 링크를 참조하자.

 

Introduction

Get started with Bootstrap, the world’s most popular framework for building responsive, mobile-first sites, with jsDelivr and a template starter page.

getbootstrap.com

이제 적용된 페이지를 확인해보자.

 

깔끔해졌다.

 

이제 projects\mysite\templates\pybo\question_detail.html 도 수정하자.

양이 많으니 잘 보고 적어야한다.
양이 많아 사진 2개로 나눠 올렸다.

수정사항이 많아서 사진외에도 따로 올리겠다.

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'bootstrap.min.css' %}">
<div class="container my-3">
<!-- 질문 -->
<h2 class="border-bottom py-2">
{{ question.subject }}
</h2>
<div class="card my-3">
<div class="card-body">
<div class="card-text" style="white-space: pre-line;">
{{ question.content }}
</div>
<div class="d-flex justify-content-end">
<div class="badge bg-light text-dark p-2">
{{ question.create_date }}
</div>
</div>
</div>
</div>
<!-- 답변 -->
<h5 class="border-bottom my-3 py-2">
{{question.answer_set.count}}개의 답변이 있습니다.
</h5>
{% for answer in question.answer_set.all %}
<div class="card my-3">
<div class="card-body">
<div class="card-text" style="white-space: pre-line;">
{{ answer.content }}
</div>
<div class="d-flex justify-content-end">
<div class="badge bg-light text-dark p-2">
{{ answer.create_date }}
</div>
</div>
</div>
</div>
{% endfor %}
<!-- 답변 등록 -->
<form action="{% url 'pybo:answer_create' question.id %}" method="post" class="my-3">
{% csrf_token %}
<div class="mb-3">
<label for="content" class="form-label">
답변내용
</label>
<textarea name="content" id="content" class="form-control" rows="10">
</textarea>
</div>
<input type="submit" value="답변등록" class="btn btn-primary">
</form>
</div>

부트스트랩으로 화면을 구성하다 보면 가끔은 이렇게 많은 양의 HTML코드를 작성해야 한다.  질문이나 답변은 하나의 뭉치에 해당하므로 부트스트랩의 card 컴포넌트를 사용했다.

다음 링크는 부트스트랩의 card 컴포넌트이다. 

https://getbootstrap.com/docs/5.1/components/card/

 

Cards

Bootstrap’s cards provide a flexible and extensible content container with multiple variants and options.

getbootstrap.com

 

question_detail.html 에 사용한 부트스트랩 클래스는 다음과 같다.

부트스트랩 클래스 설명
card, card-body, card-text 부트스트랩 card 컴포넌트
badge 부트스트랩 badge 컴포넌트
form-control, form-label 부트스트랩 form 컴포넌트
border-bottom 아래방향 테두리 선
my-3 상하 여백값 3
py-2 상하 패딩값 2(패딩=컨텐츠와 테두리사이의 여백)
부트스트랩 클래스 설명
p-2 상하좌우 패딩값 2
d-flex justify-content-end 컴포넌트의 우측 정렬
bg-light 연회색 배경
text-dark 검은색 글씨
text-start 좌측 정렬
btn btn-primary 부트스트랩 버튼 컴포넌트

질문 내용과 답변 내용에는 style="white-space: pre-line"과 같은 스타일을 지정해 주었다. 글 내용의 줄 바꿈을 정상적으로 표시하기 위해 적용한 스타일이다.

 

적용한 화면을 확인하자.

깔끔하고 예쁘게 되었다.

'Django > 따라하는 장고' 카테고리의 다른 글

14. 폼  (1) 2022.11.03
13. 표준 HTML & 템플릿 상속  (0) 2022.10.31
11. 스태틱 디렉토리  (0) 2022.10.25
10. 답변 등록하기  (0) 2022.10.22
9. URL 별칭  (0) 2022.10.20

[static 디렉토리]

 

스타일시트 파일은 장고의 스태틱 디렉토리에 저장해야 한다. 스태틱 디렉토리도 템플릿 디렉토리와 마찬가지로 config/settings.py 파일에 등록하여 사용한다. 일단 config/settings.py 파일을 수정하자.

STATICFILES_DIRS 라는 리스트 변수를 추가하고 BASE_DIR/'static' 디렉토리를 추가했다.BASE_DIR/static 은 /Users/<사용자명>/projects/mysite/static 을 의미하기때문에 다음 위치에 static 디렉토리를 생성해야한다.

 

 

[스타일 시트]

 

style.css 파일을 projects/mysite/static/style.css 에 만들고 다음과 같이 작성하자.

static폴더에 우클릭해 새파일 style.css를 만들자

 

style.css 파일에는 상세화면에 적용할 스타일을 정의했다. 답변 등록시 사용하는 텍스트 창의 넓이를 100%로 하고 '답변등록' 버튼을 상단에 10 픽셀의 여백(margin)을 설정했다.

 

[적용]

 

작성한 스타일시트 파일을 질문 상테 템플릿에 적용하자.

projects/mysite/templates/pybo/question_detail.html 을 수정하자.

템플릿에 스타일시트와 같은 스태틱 파일을 사용하기 위해서는 템플릿 최상단에 {% load static %} 태그를 먼저 삽입해야  {% static ... %} 같은 템플릿 태그를 사용할 수 있다.

이제 질문상세 페이지를 들어가 보자.

저번과 다르게 텍스트 창의 넓이가 넓어지고 '답변등록' 버튼도 버튼위에 여유 공간도 생기고 변화가 생겼다.

 

'Django > 따라하는 장고' 카테고리의 다른 글

13. 표준 HTML & 템플릿 상속  (0) 2022.10.31
12. 부트스트랩  (0) 2022.10.27
10. 답변 등록하기  (0) 2022.10.22
9. URL 별칭  (0) 2022.10.20
8. 템플릿  (1) 2022.10.19

[답변 등록 폼]

 

질문 상세 템플릿에 답변을 저장할 수 있는 form을 추가해보자.

pybo/question_detail.html 을 다음과 같이 수정하자.

답변의 내용을 입력할 수 있는 textarea 와 답변을 저장 할 수있는 "답변등록" 버튼도 추가했다. 답변 저장을 위한 URL은 form 태그의 action 속성에 {% url 'pybo:answer_create' question.id %} 로 지정했다. form 태그 바로 밑에 있는 {% csrf_token %} 은 보안에 관련된 항목으로 form으로 전송한 데이터가 실제 웹페이지에서 작성한 데이터인지를 판단하는 역할을 한다. 막약 해커가 이상한 방법으로 데이터를 전송할 경우에는 서버에서 발행한 csrf_torkn 값과 해커가 일방적으로 보낸 csrf_token 값이 일치하지 않기 때문에 블로킹 된다. 그럴므로 항상 form 태그 바로 밑에 {% cstf_token %} 태그를 위치 시켜야한다.

 

[URL 매핑]

 

이제 질문 상세 템플릿을 위와 같이 고친 후 질문 상세 페이지를 요청하면

answer_create 별칭을 찾을수 없다는 의미의 오류를 만나게 된다. 그 이유는 질문 상세 템플릿에 {% url 'pybo:answer_create' question.id %} 처럼 pybo:answer_create 별칭을 사용했기 때문이다. 이 오류를 해결하기 위해서는 pybo/urls.py 을 다음과 같이 URL 매핑을 등록해야 한다.

answer_create 별칭에 해당하는 URL 매핑 규칙을 등록했다. 이제 http://localhost:8000/pybo/answer/create/2/ 와 같은 페이지를 요청하면 URL 매핑 규칙에 의해 views.answer_create 함수가 호출된다. 그렇다면 views.answer_create 함수를 만들어줘야 한다. pybo/views.py 파일을 다음과 같이 수정하자.

answer_create 함수의 매개변수 question_id는 URL 매핑에 의해 그 값이 전달된다. 만약 http://localhost:8000/pybo/answer/create/2/ 라는 페이지를 요청하면 매개변수 question_id 에는 2 라는 값이 전달된다.

그리고 답변 등록시 텍스트창에 입력한 내용은 answer_create 함수의 첫번째 매개변수인 request 객체를 통해 읽을 수 있다. 즉, request.POST.get('content') 로 텍스트창에 입력한 내용을 읽을 수 있다는 뜻이다. request.POST.get('content') 는 POST로 전송된 form 데이터 항목 중 content 값을 의미한다. 그리고 답변을 생성하기 위해 question.answer_set.create를 사용했다. question.answer_set 은 질문의 답변을 의미한다. Question 과 Answer 모델은 서로 ForeignKey 로 연결되어 있기 때문에 이처럼 사용할 수 있다. 

 

답변을 저장하는 또 다른 방법은 다음처럼 Answer 모델을 직접 사용하는 방법이다.

필요없는 부분은 주석처리 했다

원래 적었던 부분은 주석처리 했다. 답변을 생성한 후 질문 상세 화면을 다시 보여주기 위해 redirect 함수를 사용했다. redirect 함수는 페이지 이동을 위한 함수이다. pybo:detail 별칭에 해당하는 페이지로 이동하기 위해 redirect 함수를 사용했다. pybo:detail 별칭에 해당하는 URL은 question_id 가 필요하므로 question.id 를 인수로 전달했다.

 

[답변 저장]

 

이제 질문 상세 화면을 호출해 보자.

텍스트 창에 아무 값이나 입력하고 답변을 등록하자. 그런데 등록해도 화면에 아무런 변화가 없다. 그 이유는 아직 등록된 답변을 표시하는 기능을 템플릿에 추가하지 않았기 때문이다.

 

[답변 조회]

 

등록된 답변을 질문 상세 화면에 표시하려면 pybo/question_detail.html 을 다음과 같이 수정하자.

 중간 부분에 질문에 등록된 답변을 확일할 수 있는 영역을 추가했다. question.answer_set.count 는 답변의 총 갯수를 뜻한다.

이제 다시 질문 상세 화면을 호출하면

실수로 비슷한 답변을 2개 달아서 2개가 나온다

이제 답변을 저장하고 확인까지 할수있게 되었다!

'Django > 따라하는 장고' 카테고리의 다른 글

12. 부트스트랩  (0) 2022.10.27
11. 스태틱 디렉토리  (0) 2022.10.25
9. URL 별칭  (0) 2022.10.20
8. 템플릿  (1) 2022.10.19
7. 장고 관리자  (1) 2022.10.17

[URL 하드 코딩]

 

question_list.html 템플릿에 사용된 다음 링크를 보자.

질문 상세를 위한 URL 링크이다. 하지만 이러한 URL 링크는 수정될 가능성이 있다. 예를 들어 http://localhost:8000/pybo/question/2 또는 http://localhost:8000/pybo/2/question 처럼 바뀔수 있다. 실제 프로젝트에서 이러한 URL 리팩토링은 빈번하게 발생한다. URL 링크가 자주 변경된다면 템플릿에서 사용한 모든 URL 들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 이러한 문제점을 해결하기 위해서는 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다.

 

링크의 주소 대신 별칭을 사용하려면 URL 매핑에 name 속성을 부여해야한다. pybbo/urls.py 파일을 수정하자.

http://localhost:8000/pybo/ URL 은 index 별칭을 부여했고,

http://localhost:8000/pybo/2 와 같은 URL 은 detail 이라는 별칭을 부여했다는 뜻이다.

 

이렇게 별칭을 추가하면 템플릿에서 다음처럼 사용할 수 있다.

하드코딩 되어 있던 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %} 로 변경했다. 여기서 question.id 는 URL매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.

 

현재는 pybo 앱 하나만 사용중이지만 pybo 앱 외에 다른 앱이 프로젝트에 추가 될 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생한다. 이 문제를 해결하려면 pybo/urls.py파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다.

app_name 을 pybo 로 설정했다. 그런데 이렇게 수정하고 http://localhost:8000/pybo/ 에 접속하면

이런 오류가 발생한다. 이 오류는 네임스페이스를 추가했기 때문이다. 이 오류를 해결하려면 템플릿에서 사용한 URL 별칭에 네임스페이스를 다음과 같이 지정해야한다.

detail 앞에 pybo 라는 네임스페이스를 붙여준 것이다.

'Django > 따라하는 장고' 카테고리의 다른 글

11. 스태틱 디렉토리  (0) 2022.10.25
10. 답변 등록하기  (0) 2022.10.22
8. 템플릿  (1) 2022.10.19
7. 장고 관리자  (1) 2022.10.17
6. 모델 사용법  (0) 2022.10.13

[질문 목록]

 

http://localhost:8000/pybo/ 페이지에 들어가면 등록한 질문을 볼 수 있도록 구현해 보자.

pybo/views.py 파일의 index 함수를 다음과 같이 수정하자.

 

질문 목록 데이터는 Question.objects.order_by('-create_date') 로 얻을 수 있다. order_by는 조회 결과를 정렬하는 함수이다. order_by('-create_date')는 작성일시 역순으로 정령하라는 의미이다. "  -  " 기호가 붙어 있으면 역방향, 없으면 순방향 정렬을 의미한다. 게시물은 보통 최신순으로 보기 때문에 작성일시의 역순으로 정렬한다.

 

render 함수는 파이썬 데이터를 템플릿에 적용하여 HTML로 반환하는 함수이다. 즉, 위에서 사용한 render 함수는 질문 목록으로 조회한 question_list  데이터를 pybo/question_list.html 파일에 적용하여 HTML을 생성한 후 리턴한다. 여기서 사용된 pybo/question_list.html과 같은 파일을 템플릿이라고 부른다. 템플릿 파일은 HTML 파일과 비슷하지만 파이썬 데이터를 읽어서 사용할 수 있는 HTML 파일이다. 

 

[템플릿 디렉토리]

 

render 함수에서 사용한 pybo/question_list.html 템플릿 파일을 작성해야 한다. 하지만 템플릿 파일을 작성하기 전에 템플릿 파일을 저장할 디렉토리를 먼저 만들어야 한다. 템플릿을 저장 할 디렉토리는 config/settings.py 파일의 TEMPLATES 항목에 설정해야 한다.

DIR는 템플릿 디렉토리를 여러개 등록할 수 있도록 리스트로 되어 있다. 파이보는 BASE_DIR/'templates' 디렉토리 한 개만 등록한다. 여기서 BASE_DIR 은 /Users/h<사용자명>/projects/mysite 이다.

결론적으로 전체 경로는 /Users/<사용자명 >/projects/mysite/templates 이다. 이  디렉토리는 없으므로 다음과 같이 생성하자.

가상 공간 (mysite) 에서 만들자

가상공간에서 mkdir templates 명령어를 수행한다. 장고는 DIRS에 설정한 디렉토리 외에도 앱 디렉토리 바로 하위에 있는 templates 디렉토리도 템플릿 디렉토리로 인식한다.  즉, pybo 앱의 경우 projects/mysite/pybo/templates 이러한 디렉토리를 생성하면 별다른 설정없이 템플릿 디렉토리로 인식한다.

 

하지만 이처럼 앱 디렉토리 하위에 템플릿 디렉토리를 두는 방법을 권장하지 않는다. 그 이유는 하나의 웹 사이트에서 여러 앱을 사용할 때 여러 앱의 화면을 구성하는 템플릿은 한 디렉토리에 모아 관리하는 편이 여러모로 좋다. 그러므로 pybo 앱은 템플릭 디렉토리로 projects/mysite/pybo/templates 가 아닌 /projects/mysite/templates/pybo 디렉토리를 사용한다. 그리고 공통으로 사용하는 템플릿은 projects/mysite/templates 위치에 저장한다.

모든 앱이 공통으로 사용할 템플릿 디렉토리 - projects/mysite/templates
pybo 앱이 사용할 템플릿 디렉토리 - projects/mysite/templates/pybo
common 앱이 사용할 템플릿 디렉토리 - projects/mysite/templates/common

 

[템플릿 파일]

 

이제 템플릿 파일을 만들어 보자. render 함수에서 사용한 템플릿 파일명은 pybo/question_list.html 이다.

따라서 question_list.html 파일은 projects/mysite/templates/pybo/question_list.html 경로에 작성해야 한다.

그 후 pybo/question_list.html 파일을 다음과 같이 작성하자.

오타가 있다 />pybo/ 가아니라 /pybo/ 이다.

템플릿을 보면 {% 와 %} 로 둘러쌓인 문장이 있는데 이것을 템플릿 태그라고 한다. 여기에 사용된 템플릿 태그들을 하나씩 살펴보자면

{% if question_list %} : question_list 가 있다면
{% for question in question_list %} : question_list를 순회하며 순차적으로 하나씩 question 에 대입
{{ question.id }} : for 문에 의해 대입된 question 객체의 id 번호를 출력
{{ question.subject }} : for 문에 의해 대입된 question 객체의 제목을 출력

템플릿에서 사용한 question_list 는 render 함수로 전달한 질문 목록 데이터이다.

 

[템플릿 태그]

 

장고에서 사용하는 템플릿 태그는 3가지 유형만 알면된다.

 

1. 분기

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

파이썬의 if 문과 비슷하다. 다만 항상 {% endif %} 태그로 닫아주는것을 잊지 말자.

 

2. 반복

{% for item in list %}
    <p>순서 : {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}
forloop.counter : 루프내의 순서로 1부터 표시
forloop.counter0 : 루프내의 순서로 0부터 표시
forloop.first : 루프의 첫번째 순서인 경우 True
forloop.last : 루프의 마지막 순서인 경우 True

 

3. 객체 출력

{{ 객체 }}

ex) {{ item }}

 

객체에 속성이 있는 경우는 파이썬과 동일한 방법으로 도트(.) 문자를 이용하여 표시하면 된다.

{{ 객체.속성 }}

ex) {{ question.id }}, {{ question.subject }}

 

[테스트]

 

템플릿 디렉토리 추가 후에는 로컬 서버를 재시작 해야 한다.

여기까지 수정하고 로컬 서버를 재시작 후 http://localhost:8000/pybo/ 페이지를 요청하면 다음과 같은 화면이 나온다.

이전에 등록한 질문 2건이 조회된다. 이제 질문 목록 중 한개를 선택해보면

%3EPybo랑 />pybo/ 라고 나온것은 무시하자. 오타이다.

이러한 오류가 나온다. http://localhost:8000/pybo/2/ 에 대한 URL 매핑이 아직 없기 때문이다.

 저 URL 의 의미는 id 값이 2 인 Question 을 상세 조회한다는 뜻이다. 이 URL 이 작동할 수 있도록 pybo/urls.py 파일을 수정하자.

추가한 라인의 뜻은 http://localhost:8000/pybo/2/ 페이지가 요청되면 여기에 등록한 매핑 룰에 의해 http://localhost:8000/pybo/<int:question_id/> 가 적용되어 question_id 에 2가 저장되고 views.detail 함수도 실행된다.

 

이제 위의 URL 매핑 규칙에 의해 실행되는. views.detail 함수를 만들어야 한다. pybo/views.py 파일에 detail 함수를 추가하자.

index 함수와 크게 다른 부분은 없다. 다만 detail 함수 호출시 전달되는 매개변수가 request 외에 question_id 가 추가되었다. 매개변수 request_id 에는 URL 매핑시 저장된 question_id 가 전달된다.

 

 

detail 함수에서 사용할 pybo/question_detail.html 템플릿도 작성해야한다.

projects/mysite/templates/pybo/question_detail.html 을 만들고 다음과 같이 작성하자.

{{ question.subject }} 과 {{ question.content }}의 question은 detail 함수에서 템플릿에 context 변수로 전달된 Question 모델 객체이다.

 

여기까지 했다면 다시 페이지를 요청해보자.

질문 상세 기능을 만들었다!

 

 

[오류 페이지]

 

이제는 오류 페이지를 만들어보자.

http://localhost:8000/pybo/30/ 페이지를 요청했을때의 모습이다. DoesNotExist 오류가 발생한다. 이 오류는 전달된 question_id 가 30이기 때문에 Question.object.get(id=30)이 호출되어 발생한 오류이다. 이때 브라우저에 전달되는 오류코드는 500이다.

 

이런식으로 없는 데이터를 요청할 경우 500 오류 페이지 보다는 "Not Found(404)" 페이지를 리턴하는것이 좋다.

 

[HTTP 주요 응답 코드의 종류]
오류코드 200 = 성공
오류코드 500 = 서버오류(Internal Server Error)
오류코드 404| = 서버가 요청한 페이지를 찾을수 없음(Not Found)

방금 처럼 없는 데이터를 요청할 경우 404 페이지를 출력하도록 detail 함수를 수정해보자.

수정한 pk=question_id 에서 pk 는 Question 모델의 기본 키(Primary Key) 에 해당하는 값이다. 이렇게 수정하고 다시 페이지를 요청해보자.

404 오류 페이지 출력으로 변경되었다.

'Django > 따라하는 장고' 카테고리의 다른 글

10. 답변 등록하기  (0) 2022.10.22
9. URL 별칭  (0) 2022.10.20
7. 장고 관리자  (1) 2022.10.17
6. 모델 사용법  (0) 2022.10.13
5. 장고 모델 작성법  (0) 2022.10.13

[장고 관리자 생성]

 

장고 관리자를 생성하기 위해서는 슈퍼유저를 먼저 생성해야한다. python manage.py createsuperuser 명령어를 수행해보자.

일단 아이디는 admin 비밀번호는 1111로 설정하였다.

관리자 계정이 생성 되었으니 로컬 서버를 구동한 후 http://localhost:8000/admin 페이지로 접속해보자.

admin 페이지에 로그인 화면이 나오면 아까 만들었던 슈퍼유저 계정을 입력해서 로그인 하면 

이런 화면으로 접속이 된다.

 

[모델 관리]

 

장고 관리자 계정에 저번에 만들었던 모델들을 등록해보자. pybo 앱 디렉토리에 admin.py 파일이 있다.

admin.site.register 로 Question 모델을 등록했다. 그 후 관리자 화면을 새로고침 해보면 Question 이 추가 되었다.

이제 관리자 화면에서 Question 모델을 관리 할 수 있다. 신규 질문을 생성하고 조회, 수정, 삭제할 수 있다. Question 모델의 '+추가' 링크를 클릭해보면 새로 추가하는 화면이 나온다. 제목, 내용을 추가하고 create_date 는 '오늘', '현재' 버튼을 클릭하면 자동 입력이 된다. 그 후 저장하자.

성공적으로 추가 되었다. Answer 모델도 마찬가지로 관리할 수 있다.

 

[모델 검색 기능]

 

pybo/admin.py를 열어 다음과 같이 수정해보자.

class QuestionAdmin(admin.ModelAdmin) :
       search_fields = ['subject']

명령어를 추가해 Question 모델에 세부 기능을 추가할 수 있는 QuestionAdmin 클래스를 생성하고 제목 검색을 위해 search_fields 속성에 'subject' 를 추가했다. 이렇게 하면 검색 기능이 추가된 화면을 볼 수 있다.

검색어로 '모델' 을 입력하고 검색을 하면 제목에 '모델'이 들어간 질문만 나온다. 이 외에 무수히 많은 장고 관리자 기능이 있다.

 

The Django admin site | Django documentation | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

 해당 링크를 참고해 확인하자.

'Django > 따라하는 장고' 카테고리의 다른 글

9. URL 별칭  (0) 2022.10.20
8. 템플릿  (1) 2022.10.19
6. 모델 사용법  (0) 2022.10.13
5. 장고 모델 작성법  (0) 2022.10.13
4. 파이참의 기본 요소  (0) 2022.10.12

1. 다음의 각 문제를 해결하기 위한 R 코드를 작성하시오.

(1) 1~100 사이의 정수 중 3의 배수들의합과 개수를 구하시오.

(2) 101~200 사이의 숫자 중 3과 4의 공배수를 출력하시오.

(3) 24의 약수를 출력하시오.

(4) 10!을 출력하시오.(단, factorial() 함수를 이용하지 않는다.)



2. for문을 이용하여 구구단 중 9단을 출력하는 R 코드를 작성하시오.




3. while문을 이용하여 구구단 중 8단을 출력하는 R코드를 작성하시오.

 

4. 1~100의 정수를 차례를 출력하되 3의 배수에서는 숫자 대신 '*'을 출력하는 R 코드를 작성하시오.(출력은 가로 방향으로 한다.)

 

 

 

 

 

 

 

 

 

5. 소수(prime number)는 1과 자기 자신 외에는 나누어 떨어지지 않는 수를 말한다. 2~1000 사이의 소수를 출력하는 R 코

드를 작성하시오.




6. 0, 1, 1, 2, 3, 5, 8, 13, 21 ... 형태의 수열, 즉 첫 번째 항의 값은 0이고 두 번째 항의 값은 1일 때 이후의 항들은 이전의 두 항을 더한 값으로 만들어지는 수열을 '피보나치 수열'이라고 한다. 0에서부터 시작하여 40개의 피보나치 수열을 출력하는 R 코드를 작성하시오.



7. R의 apply() 함수를 이용하여 다음 문제를 해결하는 R 코드를 작성하시오.



8. R의 apply() 함수를 이용하여 다음 문제를 해결하는 R 코드를 작성하시오.





9. 다음과 같이 두 정수를 입력하면 두 수의 최대공약수를 찾아서 반환(return)하는 R 함수 lgm()을 만들고 테스트하시오.


10. 다음과 같이 벡터를 입력하면 벡터의 최댓값과 최솟값을 반환(return)하는 R 함수 maxmin()을 만들고 테스트하시오.(반환값이 list임).


11. 10명의 몸무게를 저장한 벡터가 다음과 같을 때 질문을 해결하기 위한 R 코드를 작성하시오.

weight <- c(69, 50, 55, 71, 89, 64, 59, 70, 71, 80)


12. 다음의 문제를 해결하기 위한 R 코드를 작성하시오.(which() 함수 사용.)

 

한빛아카데미 모두를 위한 R 데이터 분석 입문

본 연습문제들은 작성자 본인이 푼것이라 틀릴 수 도 있습니다.

 

1. R을 이용하여 각 문제를 수행하기 위한 코드를 작성하시오.

> score
        m    f
[1,]  10  21
[2,] 40 60
[3,] 60 70
[4,] 20 30

 

2. R에서 제공하는 state.x77 데이터셋을 이용하여 코드를 작성하시오.

 

3. R에서 제공하는 mtcars 데이터셋은 자동차 모델에 대한 제원 정보를 담고 있다. 이 데이터셋에 대해서 다음 문제를 해결하기 위한 코드를 작성하시오.

4. R에서 제공하는 airquality 데이터셋은 일별로 대기의 질을 측정한 자료를 포함하고 있다. 이 데이터셋에 대해서 다음 문제를 해결하기 위한 코드를 작성하시오.

 

5. R에서 제공하는 swiss 데이터셋은 스위스 47개 주의 경제 자료를 포함하고 있다. 이 데이터셋에 대해서 다음 문제를 해결하기 위한 코드를 작성하시오.

 

6. R을 이용하여 각 문제를 수행하기 위한 코드를 작성하시오.

 

+ Recent posts