TIL) 데브코스 12일차 - Django(2)

Pori·2023년 10월 31일
0

데엔

목록 보기
7/47

뷰와 템플릿

뷰를 이용해서 HTML코드를 렌더링하기

  1. from django.shortcuts import render 를 추가한다 (/polls/views.py)
  2. HTML파일을 생성한다.
  3. views.py의 함수 ⇒ 페이지에 반환 값을 변경한다.
context = {'questions':latest_question_list}
return render(request, 'polls/index.html',context)

인자는 context처럼 넘겨줄 수 있는데 이 때 HTML에서는 넘겨받은 인자를 {{args}} 처럼 사용한다.

{{question}}

제어문 사용하기

인자가 여러개인 경우 1개를 출력하고자 할 때는 .index의 형태로 사용한다.

{{question.0}}
{{question.1}}
{{question.2}}
  • 반복문으로의 활용은 다음과 같다.
 {% for q in questions%}
    <li>{{q}}</li>
 {% endfor %}
  • IF문은 다음과 같다.
{% if questions %}
<ul>
    ...
</ul>
{% else %}
<p>no questions</p>
{% endif %}

Detail 설정하기

Path에 숫자를 넣어서 그 값을 인식시켜 페이지를 수정하고자 한다.

  1. /polls/urls.py에서 path를 추가한다.
# 수를 입력받아서 question_id로 사용한다.
path('<int:question_id>',views.detail, name = 'detail'),
  1. /polls/views.py에서 render하는 메서드 생성하기
def detail(request,question_id):
    question = Question.objects.get(pk=question_id)
    return render(request, 'polls/detail.html',{'question':question})
  1. detail.html생성 : 인자들을 넘겨 받아서 간단하게 다음과 같이 생성하였다.
# detail.html
<h1>
    {{question.question_text}}
</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{choice.choice_text}}</li>

{% endfor %}

링크를 사용해서 페이지 이동.

  • 태그를 활용하여 이동시키기 -> a태그 사용
  • question.id를 활용해서 href 링크를 걸어주면 된다.
{% for q in questions%}
    <li><a href="/polls/{{q.id}}">{{q.question_text}}</li>
{% endfor %}
  • 코드를 통해서 얻어오는 방법은 urlpattern의 name을 통해서 가져올 수가 있다.
# urls.py
app_name = 'polls' # app_name을 지정한 경우 app_name:name형식으로 불러와야한다.
urlpatterns = [
    path("", views.index, name = 'index'),
    path('<int:question_id>',views.detail, name = 'detail'),
    path("some_url", views.some_url),
]

# index.html
{% for q in questions%}
        <li><a href="{% url 'polls:detail' q.id %}">{{ q.question_text }}</a></li>
{% endfor %}

에러 처리하기

try,except 구문을 사용해도 가능하나 Django에서는 Shortcut을 통해 404 에러메세지를 제공한다.

from django.shortcuts import render,get_object_or_404
# 기존
question = Question.objects.get(pk=question_id)
# 변경
question = get_object_or_404(Question, pk =question_id)

폼과 커스터마이징

: 값을 제출할 용도로 사용한다.

폼을 추가하는 순서에 대해서 간단하게 설명한다.

  1. path를 추가하기. 값이 보내져서 path값이 변경되는 경우 추가해주어야 한다.
# urls.py
path('<int:question_id>/vote/', views.vote, name ='vote'),
  1. views에 메서드 생성
    여기서 주목할 점은 입력받은 값을 통해서 db와 연결하는 부분이다.
    다음 처럼 request.POST를 활용해서 name이 choice인 값을 받을 수 있다.
selected_choice = question.choice_set.get(pk = request.POST['choice'])

# detail.html에서의 name
<input type = 'radio' **name = "choice"**, id = "choice{{forloop.counter}}" value="{{choice.id}}">

# 서버에 값을 저장시키고 싶을 때에는 save를 사용한다.
selected_choice.save()
  1. form 제작하기
    : 아까 제작해두었던 vote path로 값을 post 한다.
<form action="{% url 'polls:vote' question.id %}" method ='post'>

두개의 서버에서 요청하는 경우

F 메서드를 이용해서 DB에서 값을 받고 다시 수행한다.

from django.db.models import F
selected_choice.votes = F('votes') + 1

어드민 페이지 커스터마이징

  • admin.py에서 수정한다.
  • 값을 읽기전용으로만 하고싶은 경우에는 다음처럼 readonly_fields를 걸어준다.
# admin.py
class QuestionAdmin(admin.ModelAdmin): 
    fieldsets = [
        ('질문 섹션',{'fields':['question_text']}),
        ('생성일',{'fields':['pub_date']}),
    ]
    readonly_fields = ['pub_date']
  • question에서 choice option을 관리하는 방법 만들기.
class ChoiceInLine(admin.TabularInline):
    model = Choice
    extra = 3

class QuestionAdmin(admin.ModelAdmin): 
    fieldsets = [
        ('질문 섹션',{'fields':['question_text']}),
        ('생성일',{'fields':['pub_date']}),
    ]
    readonly_fields = ['pub_date']
    inlines = [ChoiceInLine]

  • 숨김처리는 클래스 값을 추가하여 구현한다.
('생성일',{'fields':['pub_date'],'classes':['collapse']}), 

목록을 보기 좋게 만들기.

  • admin에서 목록에 column추가하기 : list_display = ('question_text','pub_date') 이렇게 한줄 추가하면된다.

  • 컬럼의 레이블을 바꿔주고싶으면 verbose_name을 추가한다.
# models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200 , verbose_name='질문')
    pub_date = models.DateTimeField(auto_now_add=True, verbose_name='생성일')

# class로 정의 한 값인 경우
from django.contrib import admin
@admin.display(boolaen=True,description='최근 생성 (하루기준)') # boolean을 하면 아이콘으로 표시된다.
  • 검색 기능

리스트 필터는 list_filter = ['pub_date'] 을 추가하여 사용한다. → 장고가 타입에 맞춰서 옵션들을 제공한다.

검색 필드는 search_fields = ['question_text', 'choice__choice_text'] 를 추가한다. → 리스트를 활용하여 옵션들을 넣을 수 있다.


공부 한 내용

  • Django의 템플릿을 활용한 페이지 구현
  • form의 활용법에 대한 이해
  • Admin 페이지 구성 변경

새롭게 배운 내용

  • Django의 템플릿을 새롭게 배웠다.
  • 에러 발생의 다양한 조건들을 다시 생각해보게 되었음. (ex. 서버-사용자 간의 통신과정에서 발생하는 문제들)

느낀점&참고

: jinja템플릿을 접해본 기억이 있어서 DTL을 접하는 과정이 그나마 이해가 빠르게 된 것 같다. 웹에 대해서 많은 경험이 있지않아 생각할 부분들이 많았다.

0개의 댓글