알쓸전컴(알아두면 쓸모있는 전자 컴퓨터)
제너릭 뷰 사용하기 본문
제너릭 뷰
URL에서 전달 된 매개 변수에 따라 데이터베이스에서 데이터를 가져 오고 이것을 view에서 rander 함수 등을 통해
템플릿에 리턴하는 기본 웹 개발의 일반적인 경우를 자주 사용하게 되면서 django 에서는 더욱더 적은 코드로 사용할수 있도록
제너릭 뷰라는 것을 제공합니다.
대표적인 제너릭 뷰에서 generic.ListView 와 generic.DetailView 가 있습니다.
먼저 views.py를 먼저 보겠습니다.
polls/views.py
from django.shortcuts import get_object_or_404, render
# Create your views here.
from django.http import HttpResponseRedirect,HttpResponse
from .models import Question,Choice
from django.urls import reverse
from django.views import generic
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):
# Redisplay the question voting form.
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
polls/urls.py
from django.conf.urls import url
from . import views
app_name = 'polls'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]urls.py -> DetailView,IndexView,ResultsView 등을 가져오게 하고
views.py 에서는 class 로 선언하고 generic.ListView or generic.DetailView 을 상속 받아 줍니다.
Generic Display View
- DetailView: 객체 하나에 대한 상세한 정보를 보여준다.
- ListView: 조건에 맞는 여러 개의 객체를 보여준다
이외에도 여러가지 제너릭 뷰가 있으나 Generic Display View 만 다뤄 보겠습니다.
ListView
url(r'^$', views.IndexView.as_view(), name='index'),
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by('-pub_date')[:5]
template_name = 'polls/index.html' 변수에는 템플릿으로 사용할 html 을 넣어 줍니다.
context_object_name = 'latest_question_list'은 템플릿에 넘겨 줄때 사용할 변수 이름을 지정합니다.
polls/index.html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
DetailView
url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
question_id -> pk 으로 바뀌 었습니다. 그이유는
polls/views.py
def detail(request,question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
에서 사용한 pk를 class DetailView 에서도 똑같이 사용할수 있도록 url 로 바로 값을 넣어준것입니다.
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
에서 model 은 상세히 보여줄 모델을 넘겨주는데 템플릿에서는 Question 의 소문자로 하여 변수를 자동 생성하여 탬플릿에서 사용할수
있게 합니다
polls/detail.html
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>처럼 model = Question 을 모두 소문자로 바꿔 탬플릿에서 question을 변수로 사용하여 사용할수가
제너릭 뷰의 기타 종류
- Base View
- View: 가장 기본이 되는 최상위 제네릭 뷰
- TemplateView: 템플릿이 주어지면 해당 템플릿을 렌더링한다.
- RedirectView: URL이 주어지면 해당 URL로 리다이렉트 시켜준다.
- Generic Display View
- DetailView: 객체 하나에 대한 상세한 정보를 보여준다.
- ListView: 조건에 맞는 여러 개의 객체를 보여준다.
- Generic Edit View
- FormView: 폼이 주어지면 해당 폼을 보여준다.
- CreateView: 객체를 생성하는 폼을 보여준다.
- UpdateView: 기존 객체를 수정하는 폼을 보여준다.
- DeleteView: 기존 객체를 삭제하는 폼을 보여준다.
Generic Date View - YearArchiveView: 년도가 주어지면 그 년도에 해당하는 객체를 보여준다.
- MonthArchiveView: 월이 주어지면 그 월에 해당하는 객체를 보여준다.
- DayArchiveView: 날짜가 주어지면 그 날짜에 해당하는 객체를 보여준다.
등이 있습니다. 추후에 필요할때 예제를 찾아서 사용하면 편할것 같습니다.
'Web > Django' 카테고리의 다른 글
| django css 적용하기 (0) | 2017.08.15 |
|---|---|
| DjangoTEST 하기 (0) | 2017.08.15 |
| django HttpResponseRedirect 하기 (0) | 2017.08.14 |
| django 간단한 폼 만들기 (0) | 2017.08.12 |
| dajngo Template 에서 하드코딩된 URL 을 제거 (0) | 2017.08.12 |