LIT(Learn I Today) 내가 오늘 배운 것들에 대한 정리
Html 연동
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'questions': latest_question_list}
return render(request, 'polls/index.html', context)
- return render 부분
- 'polls/index.html' 부분에서 polls는 polls/urls.py 파일에서 app_name = 'polls'라고 지정해 줬기 때문에 'polls/index.html'이라고 써야한다.
에러 처리
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': f"선택이 없습니다. id={request.POST['choice']}"})
else:
selected_choice.votes = F('votes') + 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:result', args=(question.id,)))
- get_object_or_404
- question_id를 찾지못하면 404에러로 인식하게 한다.
- try /except를 사용해서 선택을 하지 않았을 시 에러 메시지를 띄운다.
- 'F('votes') + 1' 이부분은 F를 써서 DB에 직접 카운트가 올라가게 한다.
Admin 페이지 커스터 마이징
class ChoiceInline(admin.TabularInline):
model = Choice
extra = 3
- extra = 3 을 하면 만들 선택지들 밑에 추가로 3개의 만들 수 있는 선택지 창이 나온다.
- Question 창에서 칼럼 명을 바꾸는 방법
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
('질문 섹션', {'fields': ['question_text']}),
('생성일', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
list_display = ('question_text', 'pub_date', 'was_published_recently')
readonly_fields = ['pub_date']
inlines = [ChoiceInline]
list_filter = ['pub_date']
search_fields = ['question_text', 'choice__choice_text']
- fieldsets를 이용하여 필드이름을 지정해주고 어떤 필드를 바꿀건지 지정한다.
- 'classes': ['collapse'] 를 사용하면 생성일을 숨겨둘 수 있다.