from django.shortcuts import render
를 추가한다 (/polls/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 questions %}
<ul>
...
</ul>
{% else %}
<p>no questions</p>
{% endif %}
Path에 숫자를 넣어서 그 값을 인식시켜 페이지를 수정하고자 한다.
# 수를 입력받아서 question_id로 사용한다.
path('<int:question_id>',views.detail, name = 'detail'),
def detail(request,question_id):
question = Question.objects.get(pk=question_id)
return render(request, 'polls/detail.html',{'question':question})
# detail.html
<h1>
{{question.question_text}}
</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{choice.choice_text}}</li>
{% endfor %}
{% for q in questions%}
<li><a href="/polls/{{q.id}}">{{q.question_text}}</li>
{% endfor %}
# 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)
: 값을 제출할 용도로 사용한다.
폼을 추가하는 순서에 대해서 간단하게 설명한다.
# urls.py
path('<int:question_id>/vote/', views.vote, name ='vote'),
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()
<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
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
('질문 섹션',{'fields':['question_text']}),
('생성일',{'fields':['pub_date']}),
]
readonly_fields = ['pub_date']
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']}),
list_display = ('question_text','pub_date')
이렇게 한줄 추가하면된다.# 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']
를 추가한다. → 리스트를 활용하여 옵션들을 넣을 수 있다.
: jinja템플릿을 접해본 기억이 있어서 DTL을 접하는 과정이 그나마 이해가 빠르게 된 것 같다. 웹에 대해서 많은 경험이 있지않아 생각할 부분들이 많았다.